我当前的EF6实现有点像这样:
public class Parent
{
public int Id { get; set; }
public virtual string Name { get; set; }
public string Description { get; set; }
public virtual ICollection Children { get; set; }
public int OtherEntityId { get; set; }
public virtual OtherEntity OtherEntity { get; set; }
}
public class Child : Parent
{
public int Id { get; set; }
public override string Name
{
get { return Parent == null ? "Dummy" : Parent.Name; }
}
public string Description { get; set; }
public ParentId { get; set; }
public virtual Parent { get; set; }
public override int OtherEntityId
{
get { return Parent == null ? default(int) : Parent.OtherEntityId; }
}
}
Child的流畅配置如下:
this.ToTable("Child")
.HasRequired(x => x.Parent)
.WithMany(x => x.Children)
.HasForeignKey(xy => xy.ParentId);
我的想法是在Parent表中为每个Parent和Child创建一个条目。 然而,Child实体不应该有自己的名称,而是从它的父级获取名称。 我还需要一种从每个孩子导航到其父母的方法。 而且我还需要一种从每个父母到孩子的导航方式。 这只超过1级。
这种实现的原因是由于要求始终从父级获取某些值,但Child必须具有与Parent相同的公共接口。 请记住,我不能在这里更改父级,它是我必须坚持的框架的一部分。所以只有孩子才是我实施的一部分。
问题似乎与变更跟踪有关。 如果我查询Child,则EF首先加载Child,检查所有属性,然后加载Parent秒。由于现在名称不同,对于EF,name属性已经更改,即使我没有手动更改它。
解决方案有点工作,只要我加载所有实体而不跟踪。当我尝试通过跟踪启用加载它时,我得到一个例外:
发生了参照完整性约束违规: 作为参照完整性一部分的主键属性 当从属对象不变时,不能更改约束 除非它被设置为协会的主要对象。 必须跟踪主要对象,并且不标记为删除。
如果尝试在加载后附加实体并将其状态设置为Unchanged,则会发生相同的情况。 我根本不更改主键或任何键,因此我不清楚为什么会发生此错误。 似乎错误发生在关系修复期间。 我担心它的" OtherEntityId"但是我无法验证它,因为我不知道如何调试它。 任何人都有想法可能是什么问题或我如何正确调试?
我试图通过以下方式获取内部值: https://www.exceptionnotfound.net/entity-change-tracking-using-dbcontext-in-entity-framework-6/ 但是
ChangeTracker.Entries()。其中(p => p.State == EntityState.Modified).ToList();
也会强制关系修正,从而导致错误。