2

상위 엔티티의 하위 엔티티를로드하려고하면 기본값으로로드됩니다. 명시 적으로로드하려고하면 예외가 throw됩니다. 다중도 제약 조건이 위반되었습니다입니다. 'CodeFirstNamespace.Association_Customer'관계의 'Association_Customer_Target'역할은 다중성 1 또는 0..1을가집니다. 이 예외는, 복잡한 그래프의 아이 엔티티의 취득 중에 Throw됩니다.상위 엔티티의 하위 엔티티를로드하는 데 문제가 있습니다. 단방향 매핑과 공유 기본 키와의 1 : 0..1 관계?

는 I 아이 엔티티를 0 또는 1에 하나의 관계 고객을 가지며 독립 연관를 갖는 그래프 협회있다. * 기본 키 *은 공유된다. 나는 EF6를 사용하고있다. 지연로드가 활성화됩니다.

public class Association 
{ 
    public virtual long Id { get; set; } 
    public virtual string ExternalId { get; set; } 
    public virtual int OrganizationId { get; set; } 
    public virtual AssociationType AssociationType { get; set; } 
    public virtual Customer Customer {get; set;} 
    public Association() 
    { 
     Customer = new Customer(); 
    } 
} 

고객 등급. 나는 내 연결 실체로드는 내가 고객을로드하려고 할 때 아이 엔티티 고객이 기본 값으로로드 완벽하게로드 할 때

public class AssociationMapping:EntityTypeConfiguration<Association> 
{ 
    public AssociationMapping() : base() 
    { 
    HasKey(x => x.Id); 
    Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    Property(x => x.ExternalId).IsRequired(); 
    Property(x => x.OrganizationId).IsRequired(); 
    Property(x => x.AssociationType); 
    HasOptional(x => x.Customer).WithRequired().WillCascadeOnDelete(); 
    } 
} 

public class CustomerMapping : EntityTypeConfiguration<Customer> 
{ 
    public CustomerMapping():base() 
    { 
    HasKey(x => x.Id); 
    Property(x => x.Id); 
    HasMany(x => x.Items) 
     .WithOptional() 
     .HasForeignKey(key => key.CustomerId) 
     .WillCascadeOnDelete(); 
    HasMany(x => x.Complaints) 
     .WithOptional() 
     .HasForeignKey(key => key.CustomerId) 
     .WillCascadeOnDelete(); 
    } 
} 

명시 적으로 예외를 throw :

public class Customer 
{ 
    public virtual long Id { get; set; } //Shared primary key 
    public virtual ICollection<Item> Items {get; set;} 
    public virtual ICollection<Complaint> Complaints {get; set;} 
    public customer() 
    { 
    Items = new List<Item>(); 
    Complaints = new List<Complaint>(); 
    } 
} 

매핑 유니 방향이다.

var dbassociation = Single<Association>(x => x.OrganizationId== asso.organizationId && x.ExternalId == asso.ExternalId && x.AssociationType == asso.AssociationType); 
dbassociation.Customer = Single<Customer>(x => x.id == dbassociation.id); 

[업데이트 : 단일 방법] 내가 연관 클래스의 고객 속성에 가상 제거하여 열망 부하에 노력하고 다음 시도 테스트 목적으로

public TEntity Single<TEntity>(System.Linq.Expressions.Expression<Func<TEntity, bool>>criteria) { 
    return Context.Set<TEntity>().SingleOrDefault(criteria); } 

하지만 같은 excepetion가 발생합니다

Context.Configuration.LazyLoadingEnabled = false; 
Context.Entry<Association>(dbassociation).Reference<Customer>(pa => pa.Customer).Load(); 

동일한 예외가 발생했습니다.

var dbassociation = Context.Set<Association>().Include("Customer").SingleOrDefault(x => x.OrganizationId== asso.organizationId && x.ExternalId == asso.ExternalId && x.AssociationType == asso.AssociationType); 

이제 예외를 검색하는 여러 가지 방법을 사용하지만 동일하다는 결론에 도달했습니다. 문제는 내가 추측하는 매핑입니다. 귀하의 의견과 제안에 감사드립니다.

+0

'협회'와 '고객'의 관계는 정확히 무엇입니까? 1 : 1, 일대 다 등인가요? 어떤 테이블에 FK 참조가 있습니까? – IronMan84

+0

나는 그것이 1 : 0..1이라는 것을 이미 언급했다. 1 차 키는 협회와 고객 사이에 공유된다. 고객이 fk 참조를 가지고 있습니다. – Mady

+1

네비게이션 속성에서'virtual' 키워드를 제거한다고해서 열렬한로드가 이루어지는 것은 아닙니다. – haim770

답변

11

Association 생성자에서

Customer = new Customer(); 

을 제거하려고합니다. 네비게이션 참조를 인스턴스화하는 것은 알려진 문제의 원인입니다 (빈 네비게이션 컬렉션을 인스턴스화하는 것과는 대조적 임). Customer을 기본값으로 사용하는 이유가 여기에 있습니다. 나는 또한 예외를 설명하는지 잘 모르겠지만, Association이 로딩되고 컨텍스트에 붙어있는 초기화되지 않은 Customer이 기본 생성자 EF가 잘못된 키를 가진 관련 엔티티를 발견했을 때 상상할 수있다. Association에 (나는) 키 값 !=0 및 관련된 Customer (결코 다른 값으로 초기화되지 않았기 때문에) 키 ==0을 가지고있다. 그러나 공유 기본 키 연관에서 두 키 값이 일치해야합니다. 그렇지 않기 때문에 예외가 발생할 수 있습니다 (단, 실제로 문제의 근원을 잘 나타내지는 않는 예외).

그냥 추측하십시오.