0

Entity Framework Code First を使用しています。私は2つのエンティティを持っています:

    public class Meal 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int MealID { get; set; }


    public virtual List<MealCategory> MealCategories { get; set; }

} 
  public class MealCategory
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int MealCategoryID { get; set; }


    public virtual List<Meal> Meals { get; set; }

}

それらは設定でマッピングされます:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Meal>()
         .HasMany(c => c.MealCategories)
         .WithMany(x => x.Meals)
         .Map(a =>
         {
             a.ToTable("MealCategoryMapping");
             a.MapLeftKey("MealID");
             a.MapRightKey("MealCategoryID");
         });


    }

既存のカテゴリに新しい食事を追加すると、完全に機能し、ID がマッピング テーブルに正しく挿入されます

        Meal Meal = new Meal();

        Meal.MealCategories = new List<MealCategory>();

        var categoryToBeAdded = (from x in Context.MealCategoreis where x.MealCategoryID == 1 select x).FirstOrDefault(); 
      Meal.MealCategories.Add(categoryToBeAdded);

        MealDataContext.Add(Meal);
        MealDataContext.SaveChanges();

ただし、食事を編集して新しいカテゴリを追加しようとすると、マッピング テーブルに何も起こりません。古いエントリは同じままで、新しいエントリは追加されません。

    Meal Meal = (from x in MealDataContext where x.MealID == 1 select x).FirstOrDefault();

        Meal.MealCategories = new List<MealCategory>();

        var categoryToBeAdded = (from x in Context.MealCategoreis where x.MealCategoryID == 4 select x).FirstOrDefault(); 
      Meal.MealCategories.Add(categoryToBeAdded);

        MealDataContext.Attach(entityToUpdate);
        MealDataContext.Entry(entityToUpdate).State = EntityState.Modified;
        MealDataContext.SaveChanges();

例外または何かがスローされません。古いマッピング エントリをすべて削除し、編集時に新しいエントリを追加する方法を教えてください。

4

2 に答える 2

0

Find最初に、データベース (またはローカル コレクションに既に存在する場合は DbContext キャッシュ) からオブジェクトを取得するために使用できることを述べさせてください。

Meal meal = MealDataContext.Meals.Find(4);
// (lower case variable name is conventional)

mealこの時点で、オブジェクトにはMealCategoriesEntity Framework によって追跡されるコレクションがあることに注意してください。新しいものに交換する必要はありません。コレクションがその時点でロードされている場合、それを置き換えると所有者からカテゴリmealが削除され、変更を保存するとジャンクション レコードが削除されます!

あなたの場合、コレクションはロードされていないため、これは起こりません。

MealCategoriesコレクションに追加したカテゴリが保存されない理由は完全にはわかりません。多分それは別の文脈から来ているように見えるからです(またはそれはタイプミスですか?)。しかし、それは例外をスローするはずです。とにかく、それを確認してください

  1. MealCategoriesコレクションを置き換えず、かつ
  2. 食事と同じコンテキスト インスタンスによって取得されるカテゴリをそれに追加します。

そして、あなたは大丈夫なはずです。

于 2013-02-08T00:18:39.230 に答える
0

これを試して。への呼び出しはCollection("MealCategories").Load();、追跡されたコレクションを作成するために EF を取得する必要があります。

Meal Meal = (from x in MealDataContext where x.MealID == 1 select x).FirstOrDefault();

MealDataContext.Attach(entityToUpdate);
MealDataContext.Entry(entityToUpdate).State = EntityState.Modified;
MealDataContext.Entry(entityToUpdate).Collection("MealCategories").Load();

var categoryToBeAdded = (
    from x in Context.MealCategories 
    where x.MealCategoryID == 4 
    select x).FirstOrDefault(); 

Meal.MealCategories.Add(categoryToBeAdded);

MealDataContext.SaveChanges();
于 2013-02-08T11:42:31.750 に答える