【问题标题】:Implementing linqtosql partial DataContext class - how to inspect before/after values实现 linqtosql 部分 DataContext 类 - 如何检查之前/之后的值
【发布时间】:2009-06-29 14:19:44
【问题描述】:

我正在尝试扩展 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 实例此时似乎没有当前值。以下代码不起作用,因为 this.AssignedTo 始终为 null。

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

【问题讨论】:

    标签: linq-to-sql partial-classes


    【解决方案1】:

    你应该可以这样做:

    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)),它似乎对我来说效果很好。您确定初始值实际上不是 null 吗?我用一个新对象以及从数据库中提取的一个对象对其进行了测试,它似乎可以正常工作。

    【讨论】:

    • 是的,我错过了什么吗?在 .NET 3.5 中添加了部分方法 - 如果您有兴趣,请查看它们:)
    • 基本上,部分类可以声明部分方法,但未定义。然后,您可以选择在单独的文件中实现它们。如果你不这样做,它就好像所有关联的方法调用都不存在一样。
    • 非常适合我。谢谢瑞恩!
    • 很好的答案。我认为 .NET 4.5 +1 中的语法有所改变
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多