实体框架TPT层次结构和关系问题

时间:2017-08-15 14:04:19

标签: entity-framework entity-framework-6 hierarchical-data table-per-type

我当前的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();

也会强制关系修正,从而导致错误。

0 个答案:

没有答案