2011-08-02 17 views
1

私はLinq To SQLを使用してViewModelの値でデータベースのレコードを更新しようとしています。私はそれが働いていたが、それ以来停止している(詳細は後述)。Linq To SQLを使用してMVC3 ViewModelからレコードを更新する

私はCustomersドメインオブジェクトをテーブルにマップしています。 AutoMapperを使用してCustomerフィールドのサブセットを持つViewModel(CustomerEditVM)にマップするために、すべてのフィールドが必要なわけではありません。私は私のサービス層でこれを実行します。私は私のビューにCustomerEditVMのViewModelを送信し、ユーザーがレコードを編集

public CustomerEditVM GetCustomerEditVMById(int custId) 
{ 
    var domainCustomer = _repository.GetCustomerById(custId); 

    Mapper.CreateMap<Customer, CustomerEditVM>(); 
    CustomerEditVM customer = Mapper.Map<Customer, CustomerEditVM>(domainCustomer); 
    return customer; 
} 

。私のサービス層では、私は戻って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(); 
     } 
    } 
} 

正常に動作するために使用アップデートが、今、このエラーで失敗します。

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を呼び出してアイテムを更新することはできません(サブミットの目的の一種である)。

関連する問題