私は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が使用されていたため、既に読み込まれているタグは認識されませんでした。
あなたはポストタイトルを修正してください - あなたは何をしていますか?多対多関係ですか? –
ええ、私はそれを変更しました。私はなぜ「1対多」と書いたのか分かりません。私はそれが多くにたくさんあることを知っています... – Shamshiel