C# 如何使用entity framework在数据库上同时保存多个对象

C# 如何使用entity framework在数据库上同时保存多个对象,c#,entity-framework,C#,Entity Framework,我试图添加一个对象列表,并将它们一次性保存到数据库中。 问题是数据库中只保存最后保存的Id! 我的代码是这样的: public void MapCarIdToDepartment(int DepartmentId, List<Guid> carIds) { var departmentCar = new DepartmentCar(); foreach (var item in carIds) { departmentCar.CarId = item;

我试图添加一个对象列表,并将它们一次性保存到数据库中。 问题是数据库中只保存最后保存的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);
    }
}

注意:我使用的是存储库模式

您每次都在更新相同的实体引用。将新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();
    }
}
这将检查现有汽车,必要时进行更新,或创建新汽车并进行更新。如果创建一个实体相当复杂,那么创建一个工厂方法,比如createCarcarId、[+其他必需的值/引用],以使代码易于理解


从这里考虑依赖注入或DbWork的一个工作单元,而不是在方法/类中重新初始化上下文。DbContexts是一个功能强大的工具,您可以利用它,所以我不建议尝试将它们隐藏在传统的CRUD包装器接口后面。获取、保存等。

因此,您将newItem传递给Save方法,而您共享的代码中似乎没有任何名称newItem。是否应该取消departmentCar?添加详细信息,提供保存方法的定义。它是否包含context.savechanges?@shahzad它是错误的,我编辑了它。@TanvirArjel保存方法很好,别担心!下面史蒂夫的答案就足够了!谢谢你们,史蒂夫!这么好的建议,我完全同意,但我不得不这样做。