2017-08-23 19 views
0

なぜAとBが多対多の関係にあるのか、Aテーブルにレコードを挿入すると、Bレコードにも新しいレコードが追加されますか?Entity Framework:多対多の関係に挿入

CustomerCourseの2つのモデルクラスがあります。 1つの顧客は多くのコースを選択できます。また、多くのお客様が1つのコースを選択することができます。

私が出会った問題は、私は彼が(たとえばcourse1course2のために)選択されたいくつかのコースで顧客を作成するときに、course1course2Coursesテーブルに既にあるということですが、それが自動的にされていない再びcourse1course2を挿入します私が望むもの

お客様クラス:

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

    [MaxLength(20)] 
    public string City { get; set; } 

    [Range(16,58)] 
    public int Age { get; set; } 
    public Gender Gender { get; set; } 

    [MaxLength(20)] 
    public string Name { get; set; } 

    public IList<Course> CoursesEnrolled { get; set; } 
} 

コースクラス:

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

    [MaxLength(50)] 
    [Required] 
    public string Name { get; set; } 
} 

CustomerControllerSave方法:

[HttpPost] 
public ActionResult Save(Customer customer 
{ 
     if (customer.Id == 0) 
     { 
      Customer customerInDb = new Customer() 
      { 
       Name = customer.Name , 
       City = customer.City , 
       Age = customer.Age , 
       Gender = customer.Gender , 
       CoursesEnrolled = customer.CoursesEnrolled 
      }; 

      _context.Customers.Add(customerInDb); 
     } 
     else 
     { 
      var customerInDb = _context.Customers.SingleOrDefault(c => c.Id == customer.Id); 

      if (customerInDb == null) 
      { 
       return HttpNotFound(); 
      } 

      customerInDb.Name = customer.Name; 
      customerInDb.Age = customer.Age; 
      customerInDb.City = customer.City; 
      customerInDb.Gender = customer.Gender; 
      customerInDb.CoursesEnrolled = customer.CoursesEnrolled; 
     } 

     try 
     { 
      _context.SaveChanges(); 
     } 
     catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) 
     { 
      Exception raise = dbEx; 

      foreach (var validationErrors in dbEx.EntityValidationErrors) 
      { 
       foreach (var validationError in validationErrors.ValidationErrors) 
       { 
        string message = string.Format("{0}:{1}", 
         validationErrors.Entry.Entity.ToString(), 
         validationError.ErrorMessage); 
        raise = new InvalidOperationException(message, raise); 
       } 
      } 

      throw raise; 
     } 

     return RedirectToAction("Index" , "Customer"); 
} 

4つのコースCoursesテーブルに存在:

enter image description here

私が選択したいくつかのコースを持つ顧客を作成すると、Customerが正常に保存し、CustomersCoursesは、データを追加しました。

しかし、Coursesテーブルでは、顧客が登録した選択コースもコーステーブルに追加されます。

enter image description here

赤い三角形内のデータは、我々が望んでいないです。

ありがとうございます、ありがとうございます!

+0

私はそれはあなたがcustomer.CoursesEnrolled' 'を持っているかについて、すべてのだと思うとどのようにあなたがそれを満たしました。既存のコースIDがない場合は、もちろん新しいコースです。しかし、あなたはその情報を私たちに推測する必要はありません。 – oerkelens

+0

あなたの返事をありがとう。理由はashinが言ったように、彼は2つの解決策を出しました。 –

答えて

0

新しいCustomerインスタンスが作成されるたびに、コースの新しいインスタンス(データベースの永続レコードのIDと同じID)を使用すると思います。 EFはそれらを新しく追加されたオブジェクトとして追跡し、変更の保存に関する新しいレコードとしてdbに挿入します。そこのオプションのカップルです:文脈から

  1. ロードコースとEFは、エンティティが既にデータベースに永続化されていることを知ることができます顧客インスタンスのCoursesEnrolledコレクションに追加します。

  2. EFがスキップするように、CoursesEnrolledをUnchanged/Detachedとして明示的にマークします。

    foreach (var course in customerInDb.CoursesEnrolled) 
    { 
        _context.Entry(course).State = System.Data.Entity.EntityState.Unchanged; 
    } 
    
+0

私はあなたが提供するこれらの2つのソリューションを試してみました。ありがとうございました。 –

+0

あなたは大歓迎です! :) – ashin

関連する問題