私はあなたがIEqualityComparerを実装することができると思います。
public class Customer
{
public string first_nm { get; set; }
public int phone_num { get; set; }
}
class CustomerComparer : IEqualityComparer<Customer>
{
public bool Equals(Customer x, Customer y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
//Check whether the customer' properties are equal.
return x.first_nm == y.first_nm && x.phone_num == y.phone_num ;
}
}
と、次のようにそれを行う:
if (newCustomer != customer)
{
myDbContext.Customers.Attach(customer,true); // true means modified.
}
またはICloneable
を実装し、customer.Clone()
にnewCustomer
を設定します。 newCustomer
が既に添付されているため、customer
を添付する必要はありません。 EF(4.1)で
、私はあなただけの修正などのエンティティを添付しなければならないと思う:
myDbContext.Customers.AttachAsModified(customer, this.ChangeSet.GetOriginal(customer), myContext);
UPDATE:L2Sは、エンティティの元の値を必要とするよう
まあ、それはそうです。あなたのコメントに応じて、タイムスタンプの列を使用するか、エンティティのサブセットを返すか、元のエンティティを手に持つかの2つの選択肢があります。あなたのシナリオでは、すでに元のエンティティを持っている:
// This is your original entity
var newCustomer = db.Customers.Where(c => c.customer_id = customer.customer_id).SingleOrDefault();
ですから、おそらく行うことができます。
if (customer != newCustomer)
{
myDbContext.Customers.Attach(customer, newCustomer);
}
注:私はあなただったら、それは複数の関連ですので、私はoriginalCustomer
からnewCustomer
の名前を変更したいですエンティティの状態に変換します。
このアプローチの問題は、元の顧客(コード内にはnewCustomer
)を取得するための追加のデータベースへの移動です。 here、here、間違いなくhereを見て、TimeStamp列を使用して余分なデータベーストリップを防ぐ方法を確認してください。
私のコードはattachメソッドに到達しますが、失敗します。「エンティティは、バージョンメンバーを宣言しているか、または更新チェックポリシーを持っていない場合、元の状態なしでのみ変更できます。エラー –
答えを更新しました。 – Kamyar