2011-02-22 95 views
4

我正在使用LINQ To SQL更新用戶地址。 我試圖跟蹤哪些字段已更新。找出哪些字段正在更新

GetChangeSet()方法只是告訴我我正在更新一個實體,但不告訴我什麼字段。

我還需要什麼?

var item = context.Dc.Ecs_TblUserAddresses.Single(a => a.ID == updatedAddress.AddressId); 

//ChangeSet tracking 
item.Address1 = updatedAddress.AddressLine1; 
item.Address2 = updatedAddress.AddressLine2; 
item.Address3 = updatedAddress.AddressLine3; 
item.City = updatedAddress.City; 
item.StateID = updatedAddress.StateId; 
item.Zip = updatedAddress.Zip; 
item.Zip4 = updatedAddress.Zip4; 
item.LastChangeUserID = request.UserMakingRequest; 
item.LastChangeDateTime = DateTime.UtcNow; 

ChangeSet set = context.Dc.GetChangeSet(); 

foreach (var update in set.Updates) 
{ 
    if (update is EberlDataContext.EberlsDC.Entities.Ecs_TblUserAddress) 
    { 

    } 
} 
+0

沒有回答這些問題能幫你嗎?一定要通過選中旁邊的複選標記來接受答案。 – shaunmartin 2011-02-24 22:40:09

回答

0

您可以通過觀察更改通知來檢測更新。通過屬性設置器中的PropertyChangingPropertyChanged事件提供通知。

E.g.另外

public partial class Ecs_TblUserAddresses 
{ 
    partial void OnCreated() 
    { 
     this.PropertyChanged += new PropertyChangedEventHandler(User_PropertyChanged); 
    } 

    protected void User_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     string propertyName = e.PropertyName; 
     // do what you want 
    } 
} 

,如果你想跟蹤一個特殊的屬性變化,你可以使用這些OnPropertyNameChanging部分的方法,例如一個:你可以擴展你的生成Ecs_TblUserAddresses類這樣(在你的例子中爲城市):

partial void OnCityChanging(string value) 
{ 
    // value parameter holds a new value 
} 
3

使用ITable.GetModifiedMembers。它返回一個ModifiedMemberInfo對象的數組,每個對象上的每個修改的屬性都有一個。 ModifiedMemberInfo包含一個CurrentValueOriginalValue,向您顯示發生了什麼變化。這是一個非常方便的LINQ to SQL功能。

例子:

ModifiedMemberInfo[] modifiedMembers = context.YourTable.GetModifiedMembers(yourEntityObject); 

foreach (ModifiedMemberInfo mmi in modifiedMembers) 
{ 
    Console.WriteLine(string.Format("{0} --> {1}", mmi.OriginalValue, mmi.CurrentValue)); 
}