我试图通过Linq to SQL更新一个数据库中的记录与ViewModel中的值。我让它工作,但它已经停止了(稍后会详细介绍)。
我有一个Customers域对象映射到一个表。我不需要所有字段,所以我使用AutoMapper将其映射到具有客户字段子集的ViewModel (CustomerEditVM)。我在我的服务层这样做:
public CustomerEditVM GetCustomerEditVMById(int custId)
{
var domainCustomer = _repository.GetCustomerById(custId);
Mapper.CreateMap<Customer, CustomerEditVM>();
CustomerEditVM customer = Mapper.Map<Customer, CustomerEditVM>(domainCustomer);
return customer;
}
我发送CustomerEditVM ViewModel到我的视图,用户编辑记录。在我的服务层中,我将其映射回一个Customer对象,并调用存储库中的Update方法:
public void SaveCustomer(CustomerEditVM customer)
{
Mapper.CreateMap<CustomerEditVM, Customer>();
Customer newCust = Mapper.Map<CustomerEditVM, Customer>(customer);
_repository.Update(newCust);
}
这是我的仓库和更新方法:
namespace AuctionAdmin.Models.Repositories
{
public interface ICustomerRepository
{
Customer GetCustomerById(int custId);
void Update(Customer customer);
}
public class CustomerRepository : ICustomerRepository
{
private AuctionAdminDataContext _dataContext;
public CustomerRepository()
{
_dataContext = new AuctionAdminDataContext();
}
public Customer GetCustomerById(int custId)
{
var customer = _dataContext.Customers.SingleOrDefault(c => c.CustomerID == custId);
return customer;
}
public void Update(Customer customer)
{
_dataContext.Customers.Attach(customer);
_dataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer);
_dataContext.SubmitChanges();
}
}
}
更新以前可以正常工作,但现在失败了,出现以下错误:
无法刷新指定对象。该对象不再存在在数据库中。
我不知道为什么这工作这么好以前和现在没有,但显然我没有使用Linq来正确更新数据库。我该怎么做呢?
谢谢
所以我的理解是Automapper并不是真的设计成这样工作的。它会像你那样使对象扁平化以获得视图模型但它不会以另一种方式做事。我相信这是故意的,因为Jimmy &工作人员更多地使用命令模式和消息传递来将内容保存回数据库。
然而,我知道这并不能解决你的问题。所以这里有一些事情。使用Linq2Sql,您需要将对象拉出,然后更新它,然后保存它。这是因为linq2sql正在跟踪对象的更改。但是,在请求之间,您不再拥有linq2sql对象。
public void SaveCustomer(CustomerEditVM customer)
{
//Get the customer from repo
var domainCustomer = _repository.GetCustomerById(customer.Id);
Mapper.CreateMap<CustomerEditVM, Customer>();
Customer newCust = Mapper.Map<CustomerEditVM, Customer>(domainCustomer);
_repository.Update(newCust);
}
然而,由于linq2sql和automapper的工作方式,这很可能不起作用。即使映射确实有效,linq2sql也可能不会显示对对象进行了更改。你最好手工映射。
并且,在Linq2Sql中确实没有Update这样的东西。
public void Update(Customer customer)
{
_dataContext.Customers.Attach(customer);
_dataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer);
_dataContext.SubmitChanges();
}
你所需要做的就是从linq2sql中获取对象,更新它并调用SubmitChanges();在_dataContext上。它会帮你搞定的。我见过一些存储库接口包含一个Update方法,但它在Linq2Sql实现中什么也不做。此外,在update方法中调用SubmitChanges可能不是最好的主意,因为你可能想要更新许多项,然后一次提交所有更改,这是SubmitChanges(即工作单元)的目的之一