我不想在孙实体上添加父实体或外键



我有三个实体,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之间没有外键。这是一致的。我不想要那个直接链接。(如果不出意外,它可能会导致级联删除的不愉快。

不过,当我启动添加迁移时,我得到以下信息:

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之间没有链接,既不是实体也不是数据库表。

我怎样才能做到这一点?

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

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

我删除了它并再次启动了添加迁移。BaseEntityGrandChild之间没有出现链接。

向所有试图理解这个不完整之谜的人道歉。

最新更新