Сначала код Entity Framework — сопоставление объектов с одним или другим

#entity-framework #ef-code-first #foreign-key-relationship

#entity-framework #ef-code-first #связь с внешним ключом

Вопрос:

Например, у меня есть Entity1 и Entity2:

 public class Entity1
{
    public int Entity1ID { get; set; }
    public string Content { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
}

public class Entity2
{
    public int Entity2ID { get; set; }
    public string Content { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
}
  

Я хочу иметь возможность добавлять комментарии, связанные с каждым объектом. Это достаточно просто, если у вас был class Entity1_Comments , Entity2_Comments например, and . Есть ли способ сохранить все комментарии в одной таблице, хотя и без путаницы в отношении того, сопоставляется ли запись с записью Entity1 или записью Entity2?

Вы могли бы, например, структурировать таблицу комментариев таким образом, чтобы она имела:

 CommentID
Entity1_or_Entity2
ForeignKeyID
... 
  

как столбцы таблицы. Таким образом, проверка того, с каким типом записи связаны комментарии, связана с использованием столбца Entity1_or_Entity2, а затем с использованием ForeignKeyID для поиска этой записи. Я не уверен, как вы могли бы сделать это, используя code-first.

Спасибо,

Майкл

Ответ №1:

Одним из подходов было бы настроить наследование TPH (таблица на иерархию) для объекта Comment. То есть создайте базовый класс Comment, сделайте Comment1 производным классом с FK для Entity1, а Comment2 — производным классом с FK для entity 2 . В итоге в вашей таблице комментариев появятся дополнительные столбцы (два FK вместо 1 плюс дискриминатор). См . http://www.asp.net/entity-framework/tutorials/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

Комментарии:

1. Спасибо! Похоже, это выполняет свою работу. Таким образом, используя новую настройку, в которой общие столбцы находятся в абстрактном классе ‘comment’, он генерирует комментарии к одной таблице со столбцами Entity1ID и Entity2ID. Все хорошо. У двух классов сущностей есть общий столбец «user», поэтому в абстрактном классе есть public virtual User user { get; set; } . В сгенерированной таблице есть три столбца User_UserID, User_UserID1 и User_UserID2, и все три являются внешними ключами. Конечно, для этого нужно сгенерировать только один столбец userId, так зачем генерировать три?

2. Трудно сказать, не видя кода, но это может быть ошибка в Code First. Команда EF отслеживает форум EF, и вы можете попробовать опубликовать там вопрос. В качестве обходного пути вы могли бы сократить количество FK с 3 до 2, переместив свойство User в производные классы. Форум EF находится по адресу social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/

Ответ №2:

Entity Framework не поддерживает разнородные ассоциации. Другие фреймворки обрабатывают это автоматически (например, NHibernate обеспечивает any сопоставление).

Мое решение состоит в том, чтобы имитировать то, что делает NHibernate, но вручную.

Есть Comment объект с EntityType EntityID полями и, внешних ключей нет. A NoteService позволяет мне добавлять / извлекать заметки из любого объекта путем сохранения / запроса с использованием этих полей.

Единственное, чего у вас, конечно, не будет, это прямая навигация.