为什么A和B处于多对多关系中,当将记录插入A表时,新记录也将添加到B表中?
有两个模型类Customer
和Course
。一个客户可以选择许多课程。此外,许多客户可以选择一门课程。
我遇到的问题是,当我创建一个客户时,他选择了一些课程(例如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");
}
Courses
表中有四个课程:
当我创建选择了某些课程的客户时,Customer
成功保存,CustomersCourses
也添加了数据。
但在Courses
表中,客户注册的选择课程也会添加到课程表中。
红色三角形中的数据不是我们想要的。
任何帮助或建议都将不胜感激,谢谢!
答案 0 :(得分:0)
我认为每次创建新的Customer实例时,都会使用新的Courses实例(与数据库中持久记录的ID相同)。 EF将它们作为新添加的对象进行跟踪,并将它们作为保存更改的新记录插入到db。有几种选择:
从上下文加载课程并将其添加到客户实例的CoursesEnrolled集合中,这样EF就可以知道该实体已在数据库中保留。
将CoursesEnrolled标记为Unchanged / Detached,以便EF跳过它。
describe('get data from file', function () {
it('should read the files from the data', function () {
var syncFile = 'somefile.txt';
expect( ).toBe( );
});
});