editableCustomers = _ctx.Customers.ProjectTo<EditableCustomer>().ToList();
editableCustomers.First().Name = "changed";
var customers = _ctx.Customers.ToList();
Mapper.Map(editableCustomers, customers);
_ctx.SaveChanges();
我使用Automapper执行EF实体(本例中为Customer)和可编辑模型(EditableCustomer)之间的映射。 为什么SaveChanges不起作用?
答案 0 :(得分:4)
您可以使用以下方式代替Automapper:
var editableCustomers = _ctx.Customers.ProjectTo<Customer>().ToList();
editableCustomers.First().Name="changed";
var customers = _ctx.Customers.ToList();
foreach (var customer in customers)
{
customer.Name = editableCustomers.First(x => x.CustomerId == customer.CustomerId).Name;
}
_ctx.SaveChanges();
答案 1 :(得分:3)
通常你会使用AutoMapper:
var results = Mapper.Map<DestinationType>(source);
或者在你的情况下
var results = Mapper.Map<Customer[]>(editableCustomers);
此外,AutoMapper不会更改上下文中的值,只是将对象从一种形式转换为另一种形式。目前看来,您只是转换对象,之后对这些对象不执行任何操作。上下文也没有意识到这些变化。
通常保存更改我宁愿使用这样的代码:
var customer = _ctx.Customers.Single(c => c.Id == modifiedEditableCustomer.Id);
customer.Name = modifiedEditableCustomer.Name;
_ctx.SaveChanges();
其中modifiedEditableCustomer是您的EditableCustomer之一(您可以遍历它们)。
这是迭代客户并保存更改的对象的另一种方法。如果对象已更改(您需要确定),则可以重新附加对象并将其状态设置为已修改。
foreach (var customer in customers)
{
if (HasCustomerBeenModified(customer))
{
_ctx.Customers.Attach(customer)
_ctx.Entry(customer).State = System.Data.Entity.EntityState.Modified;
}
_ctx.SaveChanges();
}