1

私はエンティティ、ポストを持っています:

 public class Post
 {
    [Key]
    [Required]
    public int PostId { get; set; }
 }

別のエンティティがありResponseます:

 public class Response
 {
    [Key]
    [Required]
    public int ResponseId{ get; set; }

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

アイデアは、ResponseどちらかがParentResponseId定義されているか、OR a PostId- であり、両方ではありません。Postは多くのレスポンスを持つことができ、 は多くのレスポンスを持つResponseことができます。

プロパティを介して一方から他方に移動する必要はvirtualなく、遅延読み込みも必要ありません。データベースに設定された制約が必要なだけです。

私はmodelBuilderを初めて使用しますが、これは使用する必要がある場合のようです。私は出発点を持っています:

  modelBuilder.Entity<Response>()
        .HasOptional(c => c.Post)
        .HasForeignKey(u => u.PostId);
  modelBuilder.Entity<Response>()
        .HasOptional(c => c.Response)
        .HasForeignKey(u => u.ParentResponseId);

これは、オプションの一対多を処理する正しい方法ですか? 「いずれかの FK を定義する必要がある」という制約を追加する方法はありますか? ここでのガイダンスは大歓迎です。

4

2 に答える 2

0

外部キーを1 つだけ継承Reponseして持つことができるため、どの FK を設定する必要があるかについて心配する必要はありません。Post

public class Post
{
    public int PostId { get; set; }
    public Post ParentPost { get; set; }
    public int? ParentPostId { get; set; }
}

public class Response : Post
{
}

マッピングの場合:

modelBuilder.Entity<Post>()
            .HasOptional(p => p.ParentPost)
            .WithMany()
            .HasForeignKey(p => p.ParentPostId);

今あなたがするなら

var a = new Post();
var b = new Response { ParentPost = a };
var c = new Response { ParentPost = b };
db.Posts.Add(c);
db.SaveChanges();

あなたは得るでしょう

PostId      ParentPostId Discriminator
----------- ------------ -------------
1           NULL         Post
2           1            Response
3           2            Response

投稿と返信が本質的に異なるものである場合、これはうまくいかないかもしれませんが、そうであるとはほとんど想像できません。

于 2013-11-12T08:44:48.490 に答える