2011-08-02 42 views
1

我試圖通過Linq To SQL更新數據庫中具有ViewModel中值的記錄。我有它的工作,但它已經停止(稍後更多)。使用Linq To SQL更新來自MVC3 ViewModel的記錄

我有一個Customers域對象映射到一個表。我不需要所有的字段,所以我使用AutoMapper將其映射到具有Customer字段子集的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發送到我的視圖,並且用戶編輯記錄。在我服務層我映射回給客戶對象,並調用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(); 
     } 
    } 
} 

用於正常工作的更新,但現在失敗,此錯誤:

Unable to refresh the specified object. The object no longer exists in the database.

我不知道爲什麼工作這麼好之前,現在並不清楚,但我不使用LINQ到正常更新數據庫。我應該怎麼做?

感謝

回答

1

所以我的理解是,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中沒有更新。

public void Update(Customer customer) 
    { 
     _dataContext.Customers.Attach(customer); 
     _dataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer); 
     _dataContext.SubmitChanges(); 
    } 

所有你需要做的就是從linq2sql獲取對象並更新它並調用SubmitChanges();在_dataContext上。它爲你照顧它。我已經看到一些存儲庫接口包含一個Update方法,但它在Linq2Sql實現中沒有做任何事情。此外,它可能不是最好的想法,在更新方法中調用SubmitChanges,因爲您可能想要更新可能項目然後提交所有更改一次,這是提交更改的目的(即工作單元)