EF代码优先:具有一对多的对象和相同类的M-T-M无法在db中生成M-T-M

时间:2011-09-22 22:16:50

标签: asp.net entity-framework ef-code-first

我有以下课程(缩短)

Game

{
public int id {get;set;}
public virtual ICollection<Player> Players {get;set;}
public virtual Player Owner {get;set;}
public virtual ICollection<Character> Characters {get;set;}
}

Players
{
public int id {get;set;}
public virtual ICollection<Game> Games {get;set;}
}

Characters
{
public virtual ICollection<Game> Games {get;set;}
}

无论出于何种原因,我的数据库为游戏玩家生成一对多链接。 但是,它会为游戏角色创建一个。

我不知道为什么会这样,除了一对多可能会以某种方式搞砸它!

2 个答案:

答案 0 :(得分:1)

您的Game类具有<{1}}类的两个导航属性。 EF不知道要映射到目标Player的是哪一个。因此,它决定实际上有三种关系:

  • Player.Games
  • Game.Players <-> not exposed
  • Game.Owner <-> not exposed

第四个关系是

  • Player.Games <-> not exposed

对于最后一个,EF检测到关系的右端,因为它们没有歧义。

解决这个问题最简单的方法是给EF一个提示Game.Characters <-> Character.Games引用Game的两个导航属性中哪一个实际属于Player

Player.Games

现在结果是预期的三种关系:

  • public class Game { public int id {get;set;} [InverseProperty("Games")] public virtual ICollection<Player> Players {get;set;} public virtual Player Owner {get;set;} public virtual ICollection<Character> Characters {get;set;} }
  • Game.Players <-> Player.Games
  • Game.Owner <-> not exposed

您可以通过明确地映射Game.Characters <-> Character.Games[InverseProperty]之间的多对多关系,而不是使用Game.Players属性,也可以在Fluent API中指定此属性。

答案 1 :(得分:0)

public int id是EF代码首先值的默认变量名称。它确实识别出隐式

在“字符”中省略了此键值,因此处理方式不同。