Entity Framework Code First - Entity отображается на один или другой - PullRequest
2 голосов
/ 29 октября 2011

У меня есть 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.Есть ли способ сохранить все комментарии в одной таблице, хотя не возникает путаницы относительно того, отображается ли запись в запись Entity1 или запись Entity2?

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

CommentID
Entity1_or_Entity2
ForeignKeyID
... 

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

Спасибо,

Майкл

Ответы [ 2 ]

2 голосов
/ 30 октября 2011

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

1 голос
/ 29 октября 2011

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

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

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

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

...