gpt4 book ai didi

c# - 如何使用 EF Code First 声明一对多关系?

转载 作者:太空狗 更新时间:2023-10-29 20:01:57 27 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework fluent API 定义一个简单的两个 poco 之间的一对多关系

~ Team ~
public int TeamId { get; set; }
public ICollection<User> TeamMembers { get; set; } // All the team players. Two way nav.
public Player CreatedBy { get; set; } // Which player created this team. One way navigation.
// Optional. Not all players create a team.

~ Player ~
public int PlayerId { get; set; }
public Team Team { get; set; } // The other side of the TeamMembers navigation.

注意事项:

  • 玩家不一定非要在一个团队中。 (未分配/放弃的球员)。
  • 一支球队可能没有球员(他们都离开/退出)。

我认为最接近的是这样的:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Team>()
.HasOptional(x => x.TeamMembers)
.WithMany()
.WillCascadeOnDelete(false);
}

这行不通,我也不确定如何定义其他导航。

最佳答案

我想这个对象模型就是你要找的:

public class Team
{
public int TeamId { get; set; }
public ICollection<Player> TeamMembers { get; set; }
public Player CreatedBy { get; set; }
}

public class Player
{
public int PlayerId { get; set; }
public Team Team { get; set; }
}

public class Context : DbContext
{
public DbSet<Player> Players { get; set; }
public DbSet<Team> Teams { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Player>()
.HasOptional(p => p.Team)
.WithMany(t => t.TeamMembers)
.Map(c => c.MapKey("TeamId"));

// Or alternatively you could start from the Team object:
modelBuilder.Entity<Team>()
.HasMany(t => t.TeamMembers)
.WithOptional(p => p.Team)
.Map(c => c.MapKey("TeamId"));
}
}

顺便说一句,您使用的以下 Fluent API 代码不正确:

...HasOptional(x => x.TeamMembers)

因为 TeamMembers 是一个集合,不能被 HasOptional 方法使用,该方法总是必须用单个对象调用。

更新 - HasRequired 与 HasOptional:

虽然他们都建立了一个协会,但他们提供的结果略有不同并且有不同的要求:

  • 如果它是 FK 关联(FK 属性在依赖对象上公开),则在使用 HasOptional 时它必须是可空类型,在使用 HasRequired 时它必须是不可空类型 或 Code First 将抛出。

  • Code First 将在使用 HasRequired 方法时自动打开级联删除。

  • 另一个区别是涉及删除时的 EF 运行时行为。考虑这样一个场景,我们想要删除主体对象(例如 Team),而它有一个从属对象(例如 Player)并且级联删除被关闭。使用 HasOptional 时,EF 运行时将静默地将依赖的 FK 列更新为 null,而使用 HasRequired 时,EF 将抛出并要求您显式删除依赖对象或将其与另一个主体对象相关联(如果你想尝试这个,你应该知道,在这两种情况下,主体和依赖对象都必须已经加载到上下文中,以便 EF 能够跟踪它们)。

关于c# - 如何使用 EF Code First 声明一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5368573/

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