我可以在数据库中执行此操作,但我想了解如何执行此代码优先。
我有这堂课:
public class Component
{
public Guid ID { get; set; }
public Guid Name { get; set; }
public virtual Component Master { get; set; }
public virtual ICollection<Component> Components { get; set; }
}
组件可以包含许多子组件。 组件也可以是许多其他组件中的子组件。
我想创建一个将Component的ID关联在一起的表。代表这个的最佳方式是什么?
答案 0 :(得分:2)
当你有一个像这样的自引用实体时,只能有一个父代:
public class Component
{
public Guid ID { get; set; }
public Guid Name { get; set; }
public virtual Component Master { get; set; }
public virtual ICollection<Component> Components { get; set; }
// reference to the parent guid (if any)
public Guid? MasterID { get; set; }
}
要配置实体关系,请在OnModelCreating:
中执行此操作protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>()
.HasMany(c => c.Components)
.WithOptional(c => c.Master)
.HasForeignKey(fk => fk.MasterID);
}
另一种选择是设置外部参照/连接表,而不是将其作为组件表上的列,但在这种情况下,您有多对多的关系,因此您只有一个组件母版,而不是单个组件母版。组件作为主人。您可以使用唯一键将其强制为只使用单个父级,但您仍需要从EF的角度将其建模为集合。
以下是使用外部参照表的示例:
public class Component
{
public Guid ID { get; set; }
public Guid Name { get; set; }
public virtual ICollection<Component> Masters { get; set; }
public virtual ICollection<Component> Components { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>()
.HasMany(c => c.Components)
.WithMany(c => c.Masters)
.Map(xref => xref.MapLeftKey("ParentID").MapRightKey("ChildID").ToTable("ComponentXref"));
}