2010-12-31 16 views
0

私は、Entity Framework 4、POCOを使用した多対多挿入プロセスに詳しくはありません。投稿、コメント、タグの3つのテーブルを持つブログがあります。 A ポストは多くを持つことができますタグタグは多くの場合投稿にすることができます。ここでポストタグにモデルです:私は新しいポストを追加している今エンティティフレームワーク4多対多挿入?

public class Tag 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(25, ErrorMessage = "Tag name can't exceed 25 characters.")] 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(512, ErrorMessage = "Title can't exceed 512 characters")] 
    public string Title { get; set; } 

    [Required] 
    [AllowHtml] 
    public string Content { get; set; } 

    public string FriendlyUrl { get; set; } 
    public DateTime PostedDate { get; set; } 
    public bool IsActive { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

、私が行うには正しい方法だろうかわからないんだけど。私は、私はその投稿の複数のタグを選択できるテキストボックスを持っていると思っています(この部分は既に完成しています)、私のコントローラでは、タグが既に存在するかどうかを確認します。私は新しいタグを挿入します。しかし、私はEFのために作成したモデルに基づいていても、PostsTagsテーブルを作成するのか、それとも、タグと投稿テーブルだけを作成して、2つのリンクを作成するのかはわかりません。

新しい投稿を挿入し、その投稿にタグを設定するにはどうすればよいですか?それはちょうどnewPost.Tags = Tagsです(タグは選択されていますが、すでに存在するかどうかを確認する必要がありますか?)、そして_post.Add(newPost);のようなものですか?

ありがとうございました。

+0

ちょっとサックスマン、あなたはカスタム初期設定をしていますか? (DbDatabase.SetInitializer)モデルを変更している場合は、EFがデータベースを構築して、モデルとモデルがデータベースに一致するようにする必要があります。これは、多対多がうまく動作しない理由です。あなたがこれを行う方法を知る必要がある場合は、私に教えてください! IMHO、あなたは本当にあなたのドメインモデルで検索エンティティを定義するべきではありません。 EFはあなたのためにこの作業を行い、それを透明にします。 – Paul

+0

こんにちはポール、私は 'DropCreateDatabaseIfModelChanges'にEFを設定しました。多対多リレーションシップが動作するかどうかを確認するために、もう一度ポスティングしてみます。ありがとう。 – Saxman

答えて

0

私はそれがルックアップテーブルのIDなしで働いて取得すると思われることができない、これは私はそれを動作させるために行われてきたものです。最高の効率的な方法ではないかもしれませんが、それは動作しています:

public class PostTagLookup 
{ 
    public int Id { get; set; } 
    public int PostId { get; set; } 
    public int TagId { get; set; } 

    public virtual Post Post { get; set; } 
    public virtual Tag Tag { get; set; } 
} 
1

データベースに多対多の関係を維持することをお勧めします。

PostTagまたはPostTagLookupのようなルックアップテーブルを作成することを検討する必要があります。

これは2つの列、つまりPostIdTagIdで構成されます。 his answerに@Moyoで述べたように

エンティティフレームワークは、素晴らしくルックアップテーブルを処理します。

Entity Frameworkのは、両側のエンティティのコレクションへのマッピングテーブルを変換すると、テーブル自体は基本的に消えます

+0

私は少し混乱しています。これは多対多の関係よりも優れたアプローチだと思いますか?このルックアップテーブルアプローチを利用するために私のモデルを変更する必要があるのは何ですか?ありがとうございました。 – Saxman

+0

これは実装方法によって異なります。テーブルを追加してソリューションを更新するだけで簡単に実行できます。 –

+0

ちょうど注記:ルックアップテーブル(PostId、TagId)に2つのエンティティIDを置き、追加のId列を除外してください。そのId列を追加すると、EFは参照された答えに記述されているようにルックアップテーブルを「隠す」ことはありません。 –

1

私はこれがあなたの望むものだと思います。

var tag = context.Tags.FirstOrDefault(x=>x.Name == name); 
if (tag == null) 
    context.Tags.AddObject(tag = new Tag { Name = name }); 
if (!post.Tags.Contains(tag)) 
    post.Tags.Add(tag); 

コーディングハッピーニュー・イヤーを))

+0

4行目までの 'tag'のヌルチェックは、すでに使用しています。したがって、2行目に 'NullReferenceException'が出る可能性があります。 –

+0

ありがとう、私はそれを試してみましょう。 – Saxman

+0

@ダンアトキンソンのおかげで、修正されます –