实体框架:插入多对多关系

时间:2017-08-23 03:55:33

标签: c# sql entity-framework many-to-many

为什么A和B处于多对多关系中,当将记录插入A表时,新记录也将添加到B表中?

有两个模型类CustomerCourse。一个客户可以选择许多课程。此外,许多客户可以选择一门课程。

我遇到的问题是,当我创建一个客户时,他选择了一些课程(例如course1course2),course1course2已经在Courses表,但它会自动再次插入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");
}

Courses表中有四个课程:

enter image description here

当我创建选择了某些课程的客户时,Customer成功保存,CustomersCourses也添加了数据。

但在Courses表中,客户注册的选择课程也会添加到课程表中。

enter image description here

红色三角形中的数据不是我们想要的。

任何帮助或建议都将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

我认为每次创建新的Customer实例时,都会使用新的Courses实例(与数据库中持久记录的ID相同)。 EF将它们作为新添加的对象进行跟踪,并将它们作为保存更改的新记录插入到db。有几种选择:

  1. 从上下文加载课程并将其添加到客户实例的CoursesEnrolled集合中,这样EF就可以知道该实体已在数据库中保留。

  2. 将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( );
        });
    });
    
相关问题