Несколько объектов (сообщение и продукт) имеют общую сущность (комментарий) в виде ICollection - PullRequest
0 голосов
/ 17 марта 2012

В моем проекте есть 2 класса (это увеличится) Post и Product, оба могут иметь комментарии ниже, это структура, которую я создал, но она не работает

Я создал интерфейс для объектов, которые могут иметь комментарии

public interface ICommentable
{
    int Id { get; set; }
}

Post и Product объекты могут иметь комментарии

public class Post : ICommentable
{
    public int Id { get; set; }
    public string Text { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

public class Product : ICommentable
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Rate { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

Комментарий самой сущности

public class Comment
{
    public int Id { get; set; }
    public string Message { get; set; }

    public int ItemId { get; set; }
    public ICommentable Item{ get; set; }
}

Data Contxet

public class DataBaseContext:DbContext
{
    public DbSet<Comment> Comments { get; set; }
    public DbSet<Post> Posts { get; set; }
    public DbSet<Product> Products { get; set; }
}

1 Ответ

1 голос
/ 17 марта 2012

Entity Framework не поддерживает интерфейсы, поэтому это ваша первая проблема.Вторая проблема заключается в том, что свойство навигации не может быть обычно «полиморфным» = вам нужно отдельное свойство навигации (и FK) для каждого ICommentable, который вы хотите связать с Comment:

public class Comment
{
    public int Id { get; set; }
    public string Message { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }

    public int ProductId { get; set; }
    public Product Product { get; set; }
}

Единственный сценарийгде что-то похожее может работать - это отображенное наследование, но это заставит ваши Post и Product наследовать от отображенного базового объекта, и это наследование будет отражено в базе данных.В таком случае вы можете иметь отдельную таблицу для базовой сущности, и эта таблица может иметь отношение к Comment (вместо производных таблиц).

При работе с отношениями всегда думайте о том, как бы вы сделали это в базе данных.Ваши классы, отображаемые EF, должны следовать аналогичным правилам.

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