我正在尝试添加对象列表并将它们一次保存到数据库中。 问题是只有最后保存的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);
}
}
注意:我正在使用存储库模式
答案 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()等)