나는 우리가 엔티티 프레임 워크 코드 첫 번째를 사용하여 데이터베이스에 이미 존재하는 C# 코드를 매핑 프로젝트에 참여입니다. 여기에 코드 자체를 재현하지는 않겠지 만 동일한 문제를 다루는 의사 코드를 제시 할 것입니다. 얻기 InvalidOperationException이는
나는 다른 클래스의 목록을 가지고 데이터베이스에 클래스를 매핑하는 것을 시도하고있다. 예를 보여 드리겠습니다 :public Class ListClass
{
public List<SubClassA> ListOne
{
get { return BaseClass.OfType<SubClassA>().Where(b => !b.BoolOne && b.BoolTwo).ToList(); }
}
public List<SubClassA> ListTwo
{
get { return BaseClass.OfType<SubClassA>().Where(b => b.BoolOne && b.BoolTwo).ToList(); }
}
}
public abstract class BaseClass
{
public bool BoolOne {get; set;}
#Region EF
public GUID PrimaryKey {get; set;}
public GUID ListClassForeignKey {get; set;}
#EndRegion
}
public class SubClassA : BaseClass
{
public bool BoolTwo {get; set}
}
Class SubClassB : BaseClass
{
//Contents..
}
요약 : ListClass에는 SubClassA 목록이 포함되어 있습니다. BaseClass와 SubClassA는 ListClass에 대해 아무것도 모릅니다. BaseClass의 GUID- 특성은 Entity Framework와 함께 사용하기 위해 추가됩니다. 그렇지 않으면 기존 클래스가 변경되지 않습니다. 따라서 Fluent API를이 프로젝트에 사용하는 이유는 다음과 같습니다.
class ListClassConfiguration : EntityTypeConfiguration<ListClass>
{
public ListClassConfiguration()
{
HasKey(f => f.PrimaryKey);
Property(f => f.PrimaryKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasMany(f => f.ListOne).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
HasMany(f => f.ListTwo).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
}
}
컨텍스트 클래스에는이 구성을 추가하기 만하면됩니다. 모델이 변경 될 때마다 데이터베이스가 삭제됩니다. 저는 현재 BaseClass로에 대한 TPH-매핑을 사용하고 있으며 하위 클래스입니다.
경우 InvalidOperationException :
내가 추가하고 목록에 대해 참조 물체로 ListClass을 저장하려고
, 나는이 예외를 얻을. 외래 키 구성 요소 'ListClassForeignKey은'형 'SubClassA'에 선언 된 재산이 아니다. 모델에서 명시 적으로 제외되지 않았는지와 유효한 원시 속성인지 확인하십시오. 그래서
, 조언?
편집 : 나는 실제 프로젝트에서, 빈리스트가있을 것 같다 것으로 나타났습니다. 구성 클래스에서 외래 키를 제거하려고했는데 내용이없는 데이터베이스가 있습니다 (열에 NULL 값만있는 행 하나). 이 예제에서는 'BaseClass'라는 이름의 TPH 테이블 만 비어 있거나 NULL 값만 있음을 나타냅니다. 그게 문제의 일부를 설명 할 수 있을까요?