我不想在孙实体上使用父实体或外键
I want no Parent entity or foreign key on the Grandchild entity
我有三个实体,BaseEntity
、Child
和 GrandChild
,它们可以预见地 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");
}
}
您会注意到它没有从 GrandChild
到 BaseEntity
的直接 link,并且在 GrandChild
和 BaseEntity
之间没有外键。这是一致的。我不想那么直接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 我想隐藏。
我不希望 BaseEntity
和 GrandChild
之间没有 link,既不作为实体也不作为数据库表。
我怎样才能做到这一点?
...我不好意思承认这一点。当我发布问题时,我删除了 类 中不相关的部分。我没有注意到 BaseEntity
包括这一行:
public virtual List<GrandChild> GrandChildren { get; set; }
我删除了它并再次启动了 Add-Migration。 BaseEntity
和GrandChild
之间没有出现link。
向所有试图弄明白这个不完整谜题的人致歉。
我有三个实体,BaseEntity
、Child
和 GrandChild
,它们可以预见地 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");
}
}
您会注意到它没有从 GrandChild
到 BaseEntity
的直接 link,并且在 GrandChild
和 BaseEntity
之间没有外键。这是一致的。我不想那么直接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 我想隐藏。
我不希望 BaseEntity
和 GrandChild
之间没有 link,既不作为实体也不作为数据库表。
我怎样才能做到这一点?
...我不好意思承认这一点。当我发布问题时,我删除了 类 中不相关的部分。我没有注意到 BaseEntity
包括这一行:
public virtual List<GrandChild> GrandChildren { get; set; }
我删除了它并再次启动了 Add-Migration。 BaseEntity
和GrandChild
之间没有出现link。
向所有试图弄明白这个不完整谜题的人致歉。