【问题标题】:How can I add an "IsDirty" property to a LINQ to SQL entity?如何将“IsDirty”属性添加到 LINQ to SQL 实体?
【发布时间】:2009-07-12 23:35:22
【问题描述】:

我正在将我的实体绑定到 WPF 中的编辑表单。在 DataTemplate 中,我希望能够在 DataTemplate 中设置根容器的背景颜色,以显示它已更改且这些更改尚未提交到数据库。

这是一个非常简单的示例,演示了我在说什么(请原谅错误):

<Page ...>
    <Page.DataContext>
        <vm:MyPageViewModel /> <!-- Holds reference to the DataContext -->
    </Page.DataContext>
    <ItemsControl
        ItemsSource = {Binding Items}>
        <ItemsControl.Resources>
            <DataTemplate
                DataType="Lol.Models.Item"> <!-- Item is L2S entity -->
                <!-- In real life, I use styles to set the background color -->
                <TextBlock Text="{Binding IsDirty, StringFormat='Am I dirty? /{0/}'}"/>
            </DataTemplate>
        </ItemsControl.Resources>
    </ItemsControl>
</Page>

这个例子只是打印出“我脏吗?是”或“我脏吗?不”,但你明白了。

为此,我需要向我的Item(部分类,简单)添加一个公共属性,该属性可以确定实体是否脏。这是难点。

public partial class Item
{
    public bool IsDirty
    {
        get
        {
            throw new NotImplementedException("hurf durf");
        }
    }
}

在实体之外,它非常简单(只要您有实体所附加的 DataContext)。里面,没那么多。

我有什么选择?


编辑:我认为这里没有一个好的解决方案,因此欢迎提出解决方法的建议。

(好吧,存在类似的问题,但它们都是关于如何从实体本身的外部确定这一点,并使用实体所附加的DataContext。)

【问题讨论】:

  • 它不会为你做这件事,但你没有任何理由不能实现所有逻辑来跟踪原始值并保持实体同步。使用大型模型可能会很乏味,但应该可以。
  • 是的,它会工作,但它也会非常乏味。另一个选项也是如此,您可以在其中查看 DataContext 中的未决更改。但由于 L2S 不引用其 DataContext,因此您必须将其构建(可能不是一个好主意),或者您必须从外部检查实体......

标签: wpf linq-to-sql binding dirty-data


【解决方案1】:

如果您使用的是 dbml 生成的类,您应该能够实现几个像这样的部分方法:

public partial class SampleEntity
{
    partial void OnCreated()
    {
        this.IsDirty = true;
    }

    partial void OnLoaded()
    {
        this.PropertyChanged += (s, e) => this.IsDirty = true;
        this.IsDirty = false;
    }

    public bool IsDirty { get; private set; }
}

【讨论】:

  • 这里使用 lambda 纯粹是邪恶的。我喜欢它。
  • 我考虑过这样的事情,但它没有考虑实体的原始状态。所以我相信虚假的脏东西是可能的。有什么好的方法可以防止这种情况发生?
  • 我不明白你的意思,你能给我举个例子吗?
  • 如果属性被更改,然后又改回原始值,则可能会发生错误的脏污。在 Property Changed 事件中,无法判断发送者的值是否与原始值不同(我尝试使用反射),并且我对 PropertyChanging 事件没有运气(因为 linq2Sql 不发送属性名称)
  • @klogan - 您正在寻找的不仅仅是 dbml 代码生成器为您所做的。我最终创建了自己的 linq2sql 代码生成工具来添加我想要的功能、更改引用属性命名并更正更改事件以让您知道哪些属性正在更改。要跟踪原始值,您必须编辑或子类化 dbml 类或生成您自己的代码。你有没有研究过实体框架?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多