2016-08-07 14 views
0

私はEntity Framework(6.1.3)をコードの最初の方法で使用しています。私はモデルクラスの映画や本のように見えるモデルクラスのタグがあります。多対多の関係 - Entity Frameworkが新しいオブジェクトを作成しています

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Movie>() 
       .HasMany(a => a.Tags) 
       .WithMany() 
       .Map(x => 
       { 
        x.MapLeftKey("Movie_Id"); 
        x.MapRightKey("Tag_Id"); 
        x.ToTable("MovieTags"); 
       }); 

    base.OnModelCreating(modelBuilder); 
} 
:私はセットアップには、このような1対多の関係をOnModelCreatingメソッドを上書きしていDbContextで

public class Movie 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Tag> Tags { get; set; } 
} 

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

いくつかのタグを使用してムービーをデータベースに挿入しようとすると、不要なタグが作成されるという問題があります。

たとえば、データベースに2つのタグ「Foo」(Id:1)と「Bar」(Id:2)が既にあります。今度は新しいMovieオブジェクトを作成し、既存のTag "Foo"(データベースからロードされた)と新しいTag "Foobar"をオブジェクトのCollectionに挿入します。このムービーをDbContextに追加し、メソッド "SaveChanges"を呼び出すと、データベースに2つの新しいタグがあります。

なぜEntity Frameworkは既存のタグをデータベースに挿入していますか?不足しているタグだけが挿入されるように変更する必要はありますか?

編集-1:ここでは は私がタグを追加するコントローラのコードであり、それを

を保存
List<Tag> tagList = new List<Tag>(); 
// ViewModel.Tags either contains the Tag-Id or the Tag-Name (if it is new) 
foreach (string tag in viewModel.Tags) 
{ 
    if (IsDigitsOnly(tag)) 
    { 
     // Load the existing Tag from the DbContext and add to List 
     tagList.Add(TagService.Get(int.Parse(tag))); 
    } 
    else 
    { 
     // Create new Tag 
     tagList.Add(new Tag() { Name = tag }); 
    } 
} 

Movie movie = new Movie(); 
movie.Name = viewModel.Name; 
movie.Tags = tagList; 

MovieService.Insert(movie); 

ここでは、インサートとMovieServiceコード

public void Insert(Movie movie) 
{ 
    Context.Movie.Add(movie); 
    Context.SaveChanges(); 
} 

編集-2であります: 問題が見つかりました!私のプロジェクトをどのようにセットアップするかは問題でした。 DIのためにNinjectを使用し、DbContextをリクエスト(InRequestScope)にバインドしませんでした。したがって、私のサービスの1つが呼び出されるたびに、別のDbContextが使用されていたため、既に読み込まれているタグは認識されませんでした。

+0

あなたはポストタイトルを修正してください - あなたは何をしていますか?多対多関係ですか? –

+0

ええ、私はそれを変更しました。私はなぜ「1対多」と書いたのか分かりません。私はそれが多くにたくさんあることを知っています... – Shamshiel

答えて

0

タグを追加するコードを入力してください。ところで

、私はそれはおそらく、次のように既存のタグを追加することをお勧めします

Movie.Tags.Add(new Tag { Name = "foo" }); 

のようなものだと仮定します。

Movie.Tags.Add(ctx.Tags.First(T => T.Name == "foo")); 

...または取得します同等のコードあなたのコンテキストからのタグ。

また、タグICollectionをプロキシが上書きできるようにすることもできます。それは、あまりにも見つけにくいバグの原因かもしれません。

+0

私はタグを追加する方法で私の元の質問を編集しました。しかし、私は今問題を発見し、私もそれを私の元の質問に加えました。 – Shamshiel

+0

素晴らしい。がんばろう。 – DPH

関連する問題