gpt4 book ai didi

entity-framework - 发出加载父实体的子实体。单向映射和 1 到 0..1 与共享主键的关系?

转载 作者:行者123 更新时间:2023-12-04 07:22:14 26 4
gpt4 key购买 nike

当我尝试加载父实体的子实体时,它会加载默认值。如果我尝试显式加载它会抛出异常违反了多重性约束。关系“CodeFirstNamespace.Association_Customer”的角色“Association_Customer_Target”具有多重性 1 或 0..1。检索复杂图的子实体时抛出此异常。

我有一个图 Association,它有一个子实体 Customer,其关系为 one to zero or one 并且有一个 独立关联。*主键* 共享。我正在使用 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 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>();
}
}

映射是单向的:

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();
}
}

当我加载我的关联实体时,它会完美加载,但是当我尝试显式加载 Customer 时,子实体 Customer 加载了默认值,它会抛出异常。

 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); }

出于测试目的,我尝试通过删除关联类中 Customer 属性上的 virtual 来预加载并尝试执行以下操作,但它会抛出相同的异常

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);

现在我得出结论,虽然我使用不同的方法来检索异常是相同的。我猜问题出在映射上。感谢您的意见和建议。

最佳答案

尝试删除

Customer = new Customer();

来自 Association 构造函数。实例化导航引用是已知问题的来源(与实例化空的导航集合形成对比,这很好)。这就是为什么您获得具有默认值的 Customer 的原因。我不确定它是否也解释了异常,但我可以想象当 Association 被加载并与默认创建的未初始化的 Customer 一起附加到上下文时构造函数 EF 检测到具有无效键的相关实体:具有(我假设)键值 !=0Association 和具有key ==0(因为它从未被初始化为另一个值)。但是,在共享主键关联中,两个键值必须匹配。因为它们不这样做,所以可能会导致异常(但是异常并不能很好地指向问题的根源)。

只是一个猜测。

关于entity-framework - 发出加载父实体的子实体。单向映射和 1 到 0..1 与共享主键的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20198901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com