gpt4 book ai didi

c# - 我如何建立这种 EF 关系?

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:30 25 4
gpt4 key购买 nike

我可以在数据库中执行此操作,但我想首先了解如何执行此代码。

我有这门课:

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; }
}

一个组件可以有多个子组件。一个组件也可以是许多其他组件中的子组件。

我想创建一个将组件 ID 关联在一起的表。表示这一点的最佳方式是什么?

最佳答案

当你有一个像这样的自引用实体时,它只能有一个父代:

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);
}

另一种选择是设置一个外部参照/连接表,而不是将其作为组件表中的一列,但在这种情况下,您拥有多对多关系,因此您拥有的不是单个组件主控,而是一组组件作为Master。您可以使用唯一键将其强制为仅作为单父项,但您仍然必须从 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"));
}

关于c# - 我如何建立这种 EF 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24366377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com