なぜAとBが多対多の関係にあるのか、Aテーブルにレコードを挿入すると、Bレコードにも新しいレコードが追加されますか?Entity Framework:多対多の関係に挿入
Customer
とCourse
の2つのモデルクラスがあります。 1つの顧客は多くのコースを選択できます。また、多くのお客様が1つのコースを選択することができます。
私が出会った問題は、私は彼が(たとえばcourse1
とcourse2
のために)選択されたいくつかのコースで顧客を作成するときに、course1
とcourse2
がCourses
テーブルに既にあるということですが、それが自動的にされていない再びcourse1
とcourse2
を挿入します私が望むもの
お客様クラス:
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; }
}
CustomerController
、Save
方法:
[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
テーブルに存在:
私が選択したいくつかのコースを持つ顧客を作成すると、Customer
が正常に保存し、CustomersCourses
は、データを追加しました。
しかし、Courses
テーブルでは、顧客が登録した選択コースもコーステーブルに追加されます。
赤い三角形内のデータは、我々が望んでいないです。
ありがとうございます、ありがとうございます!
私はそれはあなたがcustomer.CoursesEnrolled' 'を持っているかについて、すべてのだと思うとどのようにあなたがそれを満たしました。既存のコースIDがない場合は、もちろん新しいコースです。しかし、あなたはその情報を私たちに推測する必要はありません。 – oerkelens
あなたの返事をありがとう。理由はashinが言ったように、彼は2つの解決策を出しました。 –