EF Code First: объект с One-to-Many и MTM одного и того же класса не может генерировать MTM в БД - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть следующие классы (сокращенно)

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

По какой-то причине моя база данных генерирует ссылку «один ко многим» для Game-Players. Однако он создает игру для персонажей игр.

Я понятия не имею, почему это так, за исключением того, что один-ко-многим с этим что-то связывает!

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

Ваш класс Game имеет два свойства навигации для класса Player. EF не знает, какой из них сопоставить с целью Player.Games. По этой причине он решает, что на самом деле существует три отношения:

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

И четвертое отношение -

  • Game.Characters <-> Character.Games

Для последнего EF обнаруживает правильные концы отношений, потому что они не являются двусмысленными.

Самый простой способ исправить это - дать EF подсказку, какое из двух навигационных свойств в 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] вы также можете указать это в Fluent API путем явного сопоставления отношения «многие ко многим» между Game.Players и Player.Games.

0 голосов
/ 23 сентября 2011

public int id - это имя переменной по умолчанию для первых кодов EF ключ значений. Он действительно распознает это неявно .

Это ключевое значение опускается в символах и поэтому обрабатывается по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...