我有以下课程(缩短)
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;}
}
无论出于何种原因,我的数据库为游戏玩家生成一对多链接。 但是,它会为游戏角色创建一个。
我不知道为什么会这样,除了一对多可能会以某种方式搞砸它!
答案 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代码首先键值的默认变量名称。它确实识别出隐式。
在“字符”中省略了此键值,因此处理方式不同。