【发布时间】:2021-01-15 11:31:32
【问题描述】:
我想创建包含多个对象作为与另一个表的关系的类。
例如,如果我想使用不同的对象而不是集合来实现由三名玩家组成的团队,我的代码将如下所示:
public class Team
{
[Key]
public int TeamId { get; set; }
public string Name { get; set; }
[ForeignKey("Goalkeeper")]
[Required]
public int GoalkeeperId { get; set; }
public virtual Player Goalkeeper { get; set; }
[ForeignKey("Defender")]
[Required]
public int DefenderId { get; set; }
public virtual Player Defender { get; set; }
[ForeignKey("Striker")]
[Required]
public int StrikerId { get; set; }
public virtual Player Striker { get; set; }
}
public class Player
{
[Key]
public int PlayerId { get; set; }
public string Name { get; set; }
[ForeignKey("Team")]
public int TeamId { get; set; }
public virtual Team Team { get; set; }
}
尝试基于此代码创建迁移,但出现错误:
无法确定“团队”类型的导航属性“Player.Team”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。
我错过了什么?这甚至是实现这一点的正确方法吗?
【问题讨论】:
-
stackoverflow.com/questions/5559043/… 看看这个帖子可能会有帮助。
-
stackoverflow.com/questions/10446641/… 两个表不能互相引用,你会先在哪里插入记录。
-
@Nadeem,我见过这个。我认为这个例子有点不同,因为 Team 有一个 Matches 集合。我也从那里尝试了大多数解决方案。如果是表相互引用,我会从 Player 开始,Team 对象在那里是虚拟的,没有它也可以创建。
-
不要使用两个类,而是使用三个类。在 Player 类中添加一个名为 PlayerType 的列,您可以在其中定义球员是守门员、后卫还是前锋。团队类将具有团队 ID 和团队名称。添加第三个类,例如 TeamDetails,它将具有团队 ID 和玩家 ID。
-
在这个解决方案中,我没有将球员人数限制为 3。我希望有 3 名球员,一个守门员,一个后卫和一个前锋,可以直接访问 Team.Defender 等。这个解决方案不符合我的标准。
标签: c# entity-framework entity-framework-core