0

私のプロジェクトでは、2つのクラス(これは増加します)PostProductの両方が以下のコメントを持つことができますが、共通エンティティ(コメント)をICollectionとして持つ複数のエンティティ(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; } 
} 

データContxet

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

答えて

1

エンティティフレームワークでは、インターフェースをサポートしていません。第二の問題は、ナビゲーションプロパティは、あなたのCommentに関連するすべてのICommentableのために=あなたは別のナビゲーションプロパティ(およびFK)を必要とする通常の「多型」することはできませんです。

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; } 
} 

似た何かが働くことができる唯一のシナリオがありますマッピングされた継承を継承しますが、PostProductはマッピングされた基本エンティティから継承され、この継承はデータベースに反映されます。そのような場合、ベースエンティティ用に別のテーブルを持つことができ、このテーブルは(派生テーブルではなく)Commentとの関係を持つことができます。

リレーションを扱うときは、データベースでどのようにしたのかを常に考えてください。 EFによってマップされたクラスは、同様のルールに従わなければなりません。

+0

私が表示したコードの問題は、2つのエンティティ専用ですが、実際の状況では、コメント可能なエンティティが20以上あります。これは、「コメント」エンティティに40個以上のプロパティを作成する必要があることを意味しますブログ、BlogIdなど)。あなたがそれを書いているので、私はマップされた継承を使うつもりです。マップされた継承の短所は何ですか? –

+0

私の最後の段落に戻る。あなたは20のFKを持たずにデータベースでそれをどのようにしましたか?マップされた継承は、すべての派生型を単一のエンティティセットの一部にします。継承階層の一部を照会するときにEFが恐ろしい照会を行うことがあるため、照会のパフォーマンスに多少の影響を与える可能性があります。また、同じPK値を持つ異なる派生型からの2つのレコードを持つことを禁止する、基本エンティティのマップされた継承に一意のPKを保持する必要があります。 –

関連する問題