找出正在更新的字段

时间:2011-02-22 18:48:39

标签: linq-to-sql

我正在使用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)
    {

    }
}

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:0)

您可以通过观察更改通知来检测更新。通过属性设置器中的PropertyChangingPropertyChanged事件提供通知。

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
}