私のプロジェクトでは、2つのクラス(これは増加します)Post
とProduct
の両方が以下のコメントを持つことができますが、共通エンティティ(コメント)を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; }
}
私が表示したコードの問題は、2つのエンティティ専用ですが、実際の状況では、コメント可能なエンティティが20以上あります。これは、「コメント」エンティティに40個以上のプロパティを作成する必要があることを意味しますブログ、BlogIdなど)。あなたがそれを書いているので、私はマップされた継承を使うつもりです。マップされた継承の短所は何ですか? –
私の最後の段落に戻る。あなたは20のFKを持たずにデータベースでそれをどのようにしましたか?マップされた継承は、すべての派生型を単一のエンティティセットの一部にします。継承階層の一部を照会するときにEFが恐ろしい照会を行うことがあるため、照会のパフォーマンスに多少の影響を与える可能性があります。また、同じPK値を持つ異なる派生型からの2つのレコードを持つことを禁止する、基本エンティティのマップされた継承に一意のPKを保持する必要があります。 –