我不想在孙实体上使用父实体或外键

I want no Parent entity or foreign key on the Grandchild entity

我有三个实体,BaseEntityChildGrandChild,它们可以预见地 link 组合在一起。

它是这样的:

    public class BaseEntity
    {
        public string CompanyId { get; set; }

        public string BaseEntityId { get; set; }

        public virtual List<Child> Children { get; set; }
    }

    public class Child
    {
        public string CompanyId { get; set; }

        public string BaseEntityId { get; set; }

        public string ChildId { get; set; }

        public virtual BaseEntity Parent { get; set; }

        public virtual List<GrandChild> GrandChildren { get; set; }
    }

    public class GrandChild
    {
        public string CompanyId { get; set; }

        public string BaseEntityId { get; set; }

        public string ChildId { get; set; }

        public string GrandChildId { get; set; }

        public virtual Child ParentChild { get; set; }
    }

    public class BaseContext : DbContext
    {
        protected override void OnModelCreating(ModelBuilder p_mbuModel)
        {
            p_mbuModel.Entity<BaseEntity>().ToTable("T_BaseEntity");

            p_mbuModel.Entity<BaseEntity>().HasKey(t => new { t.CompanyId, t.BaseEntityId });

            p_mbuModel.Entity<Child>().ToTable("T_Child");

            p_mbuModel.Entity<Child>().HasKey(t => new { t.CompanyId, t.BaseEntityId, t.ChildId });

            p_mbuModel.Entity<Child>().HasOne(c => c.Parent).
                                       WithMany(p => p.Children).
                                       HasForeignKey(c => new { c.CompanyId, c.BaseEntityId }).
                                       HasConstraintName("FK_Child_BaseEntity");

            p_mbuModel.Entity<GrandChild>().ToTable("T_GrandChild");

            p_mbuModel.Entity<GrandChild>().HasKey(t => new { t.CompanyId, t.BaseEntityId, t.ChildId, t.GrandChildId });

            p_mbuModel.Entity<GrandChild>().HasOne(gc => gc.ParentChild).
                                            WithMany(c => c.GrandChildren).
                                            HasForeignKey(gc => new { gc.CompanyId, gc.BaseEntityId, gc.ChildId }).
                                            HasConstraintName("FK_GrandChild_Child");
        }
    }

您会注意到它没有从 GrandChildBaseEntity 的直接 link,并且在 GrandChildBaseEntity 之间没有外键。这是一致的。我不想那么直接link。 (如果没有别的,它可能会导致级联删除的不愉快。)

不过,当我启动 Add-Migration 时,我得到以下信息:

    table.ForeignKey(
        name: "FK_T_GrandChild_T_BaseEntity_BaseEntityId",
                        columns: x => { x.CompanyId, x.BaseEntityId },
                        principalTable: "T_BaseEntity",
                        principalColumns: new { "CompanyId", "BaseEntityId" },
                        onDelete: ReferentialAction.Cascade);

正是我试图避免的事情。 (在迁移时,它创建了我不想要的外键约束,并且使用那个笨重的名称来启动。)

我试过添加

    p_mbuModel.Entity<GrandChild>().Ignore(t => new { t.CompanyId, t.BaseEntityId });

这引发了异常

The expression 't => new <>f__AnonymousType10`2(CompanyId = t.CompanyId, BaseEntityId = t.BaseEntityId)' is not a valid property expression. The expression should represent a simple property access: 't => t.MyProperty'.

(我想这是意料之中的;对我来说这是一个很渺茫的机会。)

我可以将 GrandParent 属性 添加到 GrandChild 并在其上使用 Ignore(),但这需要我创建非常 link 我想隐藏。

我不希望 BaseEntityGrandChild 之间没有 link,既不作为实体也不作为数据库表。

我怎样才能做到这一点?

...我不好意思承认这一点。当我发布问题时,我删除了 类 中不相关的部分。我没有注意到 BaseEntity 包括这一行:

        public virtual List<GrandChild> GrandChildren { get; set; }

我删除了它并再次启动了 Add-Migration。 BaseEntityGrandChild之间没有出现link。

向所有试图弄明白这个不完整谜题的人致歉。