我希望孙子实体上没有父实体或外键

问题描述 投票:0回答:1

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

它是这样的:

    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的直接链接,也没有GrandChildBaseEntity之间的外键。这是一致的。我不希望直接链接。 (如果没有别的,它可能会导致级联删除的不愉快。)

不过,当我启动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(),但这需要我创建我想要隐藏的链接。

我想要BaseEntityGrandChild之间没有链接,既不是实体也不是数据库表。

我怎样才能做到这一点?

foreign-keys entity-framework-core code-first grandchild
1个回答
0
投票

......我很尴尬承认这一点。当我发布问题时,我修剪了课程中不相关的部分。我没有注意到BaseEntity包括这一行:

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

我删除了它并再次启动了Add-Migration。 BaseEntityGrandChild之间没有联系。

向任何试图理解这个不完整的谜语的人道歉。

© www.soinside.com 2019 - 2024. All rights reserved.