如何使用实体框架一次将多个对象保存在数据库中

时间:2019-03-21 10:35:58

标签: c# entity-framework

我正在尝试添加对象列表并将它们一次保存到数据库中。 问题是只有最后保存的ID才保存在数据库中! 我的代码是这样的:

public void MapCarIdToDepartment(int DepartmentId, List<Guid> carIds)
{
    var departmentCar = new DepartmentCar();
    foreach (var item in carIds) {
        departmentCar.CarId = item;
        departmentCar.DepartmentId = DepartmentId;
        departmentCar.State = ObjectState.Added;
        Save(departmentCar);
    }
}

注意:我正在使用存储库模式

1 个答案:

答案 0 :(得分:1)

您每次都更新相同的实体引用。在循环中移动新DepartmentCar的声明。

public void MapCarIdToDepartment(int DepartmentId, List<Guid> carIds)
{
    foreach (var item in carIds)
    {
       var departmentCar = new DepartmentCar
       {
           CarId = item,
           DepartmentId = DepartmentId
       };
       Save(departmentCar);
    }
}

理想情况下,尽管您要做的只是创建一辆新车,将其添加到DbContext的Cars DbSet中,然后完成此操作,最后在上下文中调用SaveChanges。对于ID,如果可以获取现有汽车,则需要检查该对象的上下文以进行更新还是创建新对象。

public void MapCarIdToDepartment(int departmentId, List<Guid> carIds)
{
    using (var context = new CarContext())
    {
        foreach (var carId in carIds)
        {
            var car = context.DepartmentCars.SingleOrDefault(x => x.CarId == carId);
            if (car == null)
            {
                car = new DepartmentCar{ CarId = carId };
                context.DepartmentCars.Add(car);
            }
            car.DepartmentId = departmentId;
        }
        context.SaveChanges();
    }
}

这将检查现有的汽车,必要时对其进行更新,或创建新的汽车并进行更新。如果确实需要创建一个实体,则创建一个工厂方法,例如“ createCar(carId,[+其他必需的值/引用])”,以使代码易于理解。

从这里考虑依赖注入或DbContext的工作单元,而不是在方法/类中新建上下文。 DbContexts是一个功能强大的工具,您可以利用它,因此,我不建议您尝试将它们隐藏在传统的CRUD包装器接口后面。 (Get(),Save()等)