EF는이 기능을 직접 지원하도록 설계되지 않았습니다. EF는 ORM이며 ORM은 주로 디자인 타임에 사용하고 매핑 할 유형을 지정하고 런타임에 사용하기 만하면 목적을 위해 만들어집니다. 런타임에 (코드 매핑을 사용하여) 유형을 만들 수 없다는 의미는 아니지만 훨씬 더 복잡합니다.
컨텍스트는 매핑해야하는 모든 유형과 매핑에 대해 알아야합니다. 새로운 유형에 대한 참조가없는 컨텍스트를 작성하는 경우 컨텍스트를 알 수 없습니다. 그것을 해결하는 방법? 뿐만 아니라
- 방출 컨텍스트 코드와 방출 컨텍스트 코드가 커스텀 매핑을 지정합니다 (기본 매핑 규칙을 사용하는) 또는뿐만 아니라
OnModelCreating
방법을 방출 형 DbSet<YourEmittedEntityType>
의 공공 재산이 포함되어 있는지 확인하십시오 : 나는 두 가지 옵션에 대해 생각할 수 있습니다.
- 새 엔티티에 대한 구성 (
EntityTypeConfiguration<YourEmittedEntityType>
에서 파생 됨) 클래스를 내 보냅니다. 이 클래스는 데이터베이스 테이블에 새로운 엔티티의 매핑을 지정합니다. 구성이 끝나면 수동으로 DbModelBuilder
을 작성하여 런타임에 작성된 새 엔티티 유형 구성을 등록하고 DbModel
을 빌드하고 컴파일 한 후 DbCompiledModel
을 사용하여 DbContext
의 새 인스턴스를 구성 할 수 있습니다. 건설에 시간이 많이 걸리기 때문에 사용자에게 캐시 후속 사용을 위해 DbCompiledModel
을 사용하게하십시오.
두 경우 모두 새 항목을 유지하고 검색하는 데 사용되는 테이블이 이미 만들어 졌는지 확인하고 데이터베이스 이니셜 라이저를 해제하십시오. 데이터베이스를 수동으로 유지 관리해야합니다.
물론 이것은 첫 번째 단계 일뿐입니다. 이제 새로운 엔티티와 컨텍스트를 사용할 코드를 생성/생성해야합니다. EF는 인터페이스에서 작동하지 않으며 상속은 특수하게 처리되므로 대부분의 시나리오에서 방출 된 유형을 직접 사용하는 코드가 필요합니다.
런타임에로드되는 타입이 무엇을 의미합니까? –
형식이 현재 어셈블리에는 없지만 런타임에로드됩니다. 더 자세히 알려면 Reflection.Emit을 통해 생성됩니다. – Tommy