我正在使用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 :(得分:3)
使用ITable.GetModifiedMembers
。它返回一个ModifiedMemberInfo
个对象数组,对应于实体上的每个修改后的属性。 ModifiedMemberInfo
包含CurrentValue
和OriginalValue
,向您显示已更改的内容。这是一个非常方便的LINQ to SQL功能。
示例:强>
ModifiedMemberInfo[] modifiedMembers = context.YourTable.GetModifiedMembers(yourEntityObject);
foreach (ModifiedMemberInfo mmi in modifiedMembers)
{
Console.WriteLine(string.Format("{0} --> {1}", mmi.OriginalValue, mmi.CurrentValue));
}
答案 1 :(得分:0)
您可以通过观察更改通知来检测更新。通过属性设置器中的PropertyChanging
或PropertyChanged
事件提供通知。
E.g。您可以像这样扩展生成的Ecs_TblUserAddresses
类:
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
部分方法,例如(对于你的例子中的城市):
partial void OnCityChanging(string value)
{
// value parameter holds a new value
}