实现linqtosql部分DataContext类 - 如何检查值之前/之后

时间:2009-06-29 14:19:45

标签: linq-to-sql partial-classes

我正在尝试扩展VS设计器生成的linqtosql类,并且需要确定特定字段的值是否已更改。有没有办法让我在表格/实体的DataContext Update方法中访问字段的前后值?

这是我的代码:

public partial class DataClassesDataContext
{
    partial void UpdateActivity(Activity instance)
    {
        this.ExecuteDynamicUpdate(instance);
        //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has
    }
}

我也愿意向Activity实体类中添加一个属性来表示值是否已更改,但我无法弄清楚如何判断值是否已更改。我不能只使用Activity类的OnAssignedToChanged方法,因为只要设置了属性值就会触发,不一定会更改。我正在使用ListView和LINQDataSource控件进行更新,因此无论如何都会设置它。

我还以为我可以使用OnAssignedToChanging方法,但Activity实例似乎没有当前值。以下代码不起作用.AssignedTo始终为null。

partial void OnAssignedToChanging(int? value)
{
   if (value != this.AssignedTo)
   {
      _reassigned = true;
   }
}

1 个答案:

答案 0 :(得分:9)

你应该可以这样做:

public partial class DataClassesDataContext
{
    partial void UpdateActivity(Activity instance)
    {
        Activity originalActivity = Activities.GetOriginalEntityState(instance);
        if (instance.Property != originalActivity.Property)
        {
            // Do stuff
        }
        this.ExecuteDynamicUpdate(instance);
        //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has
    }
}

另一种选择:

public partial class DataClassesDataContext
{
    partial void UpdateActivity(Activity instance)
    {
        ModifiedMemberInfo[] changes = Activities.GetModifiedMembers(instance);
        foreach (var change in changes)
        {
            Console.WriteLine("Member: {0}, Orig: {1}, New: {2}", change.Member, change.OriginalValue, change.CurrentValue);
        }

        this.ExecuteDynamicUpdate(instance);
        //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has
    }
}

我刚刚检查了你的另一个选项(OnAssignedToChanging(int? value)),它似乎对我很好。你确定初始值实际上不是空的吗?我测试了一个新对象以及一个从数据库中提取的对象,它似乎正常工作。