Ошибка загрузки дочернего объекта родительского объекта. Однонаправленное отображение и отношение 1 к 0..1 с общим первичным ключом?

ef-code-first entity-framework entity-framework-6 entity-framework-ctp5

Вопрос

Когда я пытаюсь загрузить дочерний объект родительского объекта, он загружается со значениями по умолчанию. Если я пытаюсь загрузить явно, это исключает исключение Ограничение множественности . Роль 'Association_Customer_Target' отношения 'CodeFirstNamespace.Association_Customer' имеет множественность 1 или 0..1. Это исключение выбрасывается при извлечении дочерних объектов сложного графа.

У меня есть ассоциация граф, у которой есть дочерний объект Customer с отношением от одного до нуля или один, и имеет независимую ассоциацию . * Первичный ключ * является общим . Я использую EF6. ленивая загрузка включена.

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

Класс клиента.

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

Отображение однонаправлено:

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

Когда я загружаю свою ассоциативную сущность, она загружается отлично, но дочерний объект. Клиент загружается значениями по умолчанию, когда я пытаюсь загрузить клиента, явно выдает исключение.

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

[Обновление: один метод]

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

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

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

Я также пробовал, что бросает одно и то же исключение

public class Association
{
   public virtual long Id { get; set; }
   public virtual string ExternalId { get; set; }
   public virtual int OrganizationId { get; set; }
   public virtual AssociationType AssociationType { get; set; }
   public virtual Customer Customer {get; set;}
   public Association()
   {
       Customer = new Customer();
   }
}

Теперь я пришел к выводу, что, хотя я использую разные методы для извлечения исключения, это то же самое. Я думаю, проблема в сопоставлении. Я ценю ваши комментарии и предложения.

Принятый ответ

Попробуйте удалить

Customer = new Customer();

от конструктора Association . Мгновенные ссылки на навигацию являются источником известных проблем (в отличие от создания пустых коллекций навигации, которые являются точными). Это причина, по которой вы получаете Customer со значениями по умолчанию. Я не уверен, объясняет ли это также исключение, но я мог представить, что когда Association загружается и присоединяется к контексту вместе с неинициализированным Customer созданным конструктором по умолчанию, EF обнаруживает связанные объекты с недопустимыми ключами: Association которая имеет ( Я предполагаю) ключевое значение !=0 и связанный с ним Customer с ключом ==0 (потому что он никогда не был инициализирован другим значением). Однако в общей ассоциации первичных ключей должны совпадать два ключевых значения. Поскольку они этого не делают, это может вызвать исключение (однако исключение не очень хорошо указывает на корень проблемы).

Просто догадка.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему