Однонаправленные ассоциации «один ко многим» в Entity Framework 4?

Поддерживает ли EF 4 однонаправленные ассоциации «один ко многим», например:

public class Parent
{
  public int Id { get; set; }
  public string Something { get; set; }
  public List<Child> AllMyChildren { get; set; }
}

public class Child
{
  public int Id { get; set; }
  public string Anotherthing { get; set; }
  // I don't want a back-reference to the Parent!
  // public int ParentId { get; set; }
}

Когда я пытаюсь скомпилировать свой проект с ассоциацией между Parent и Child, где End2 Navigation пуст (потому что я снял флажок End2 Navigation Property в диалоговом окне Add Association), я получаю

Ошибка 2027: не указано сопоставление для следующего EntitySet/AssociationSet — дочерний.

ОБНОВЛЕНИЕ:

А что, если у меня есть просто список или подобное свойство в родительском, а не в списке? Нужно ли мне создавать тип оболочки для хранения String, чтобы я также мог хранить обратную ссылку на Parent?


person Eric J.    schedule 30.05.2010    source источник
comment
Почему бы вам не хотеть обратную ссылку? Почему это беспокоит вас? Это является поведением по умолчанию для EF, и я не думаю, что вы можете его отключить — ассоциация — это всегда улица с двусторонним движением.   -  person marc_s    schedule 30.05.2010
comment
@marc_s: дочернему элементу никогда не нужно будет ссылаться на своего родителя, и он никогда не будет перемещен от одного родителя к другому. С точки зрения бизнес-объекта нет необходимости ссылаться на родителя или заботиться о нем. Если я добавлю ссылку на родителя, это просто для удовлетворения требований механизма постоянства. На самом деле Child была структурой с несколькими простыми свойствами, прежде чем мне пришлось изменить ее на класс, чтобы удовлетворить требованиям EF.   -  person Eric J.    schedule 30.05.2010
comment
@Eric J: Хорошо, с точки зрения пуриста, я понимаю ваше отношение к этому. Но зачем с этим бороться — просто будьте прагматичны и принимайте то, как работает ваш фреймворк, и работайте в соответствии с ним, а не против него. Вы избавите себя от многих горя.   -  person marc_s    schedule 30.05.2010
comment
@marc_s: Мне нравится начинать как пурист (когда я так или иначе придерживаюсь твердых убеждений), а затем принимать обоснованные решения о том, где имеет смысл отступить во имя прагматизма. Если EF просто не выполняет однонаправленные отношения 1: n, это, вероятно, разумный компромисс, но я пока не уверен, что это правда. Если бы все пуристы приняли то, что есть, EF 4 все равно не поддерживал бы POCO ;-)   -  person Eric J.    schedule 30.05.2010
comment
@Eric J: да, правда :-) Думаю, нам нужны как пуристы, так и прагматики, и формировать инструменты и набор их функций вместе :-)   -  person marc_s    schedule 30.05.2010
comment
@marc_s: Что, если у меня есть просто List‹string› в Parent, а не List‹Child›? Нужно ли мне создавать класс-контейнер для строки и обратной ссылки на Parent?   -  person Eric J.    schedule 31.05.2010
comment
В этом скринкасте есть демонстрация того, как сделать однонаправленную ассоциацию в EF 4. Это должно поддерживаться.   -  person Craig Stuntz    schedule 01.06.2010


Ответы (1)


Поверьте, что это будет работать с использованием Fluent API (единственный способ определения однонаправленных ассоциаций)

modelBuilder.Entity<Child>()
.HasKey(t => t.Id);

modelBuilder.Entity<Parent>()
.HasMany(p => p.AllMyChildren)
.WithRequiredPrincipal();

http://msdn.microsoft.com/en-us/library/hh295843(v=VS.103).aspx

person DTA    schedule 06.01.2012