当我调用SaveChanges时,没有任何东西保存回数据库?

时间:2018-01-03 20:40:15

标签: c# entity-framework automapper

        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不起作用?

2 个答案:

答案 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();
}