65.9K
CodeProject 正在变化。 阅读更多。
Home

将 INotifyPropertyChanged 添加到 Entity Framework 类

starIconstarIconstarIconstarIconstarIcon

5.00/5 (13投票s)

2014年12月15日

CPOL

2分钟阅读

viewsIcon

54956

为 Entity Framework 6.0 实体类的每个属性自动实现 INotifyPropertyChanged

引言

本技巧提供了一种简单的方法,可以为给定的 Entity Framework 6.0 实体类的每个属性自动实现 INotifyPropertyChanged

背景

在使用 Entity Framework 的“数据库优先”选项时,Visual Studio 会从现有的数据库生成你的实体类。 纯粹主义者可能会反对,但有时如果生成的类实现了 INotifyPropertyChanged,以便你可以直接在 WPF 应用程序中将数据绑定到它们,那就太好了。 不幸的是,Entity Framework 6.0 不会自动为你实现 INPC。

Using the Code

首先,安装一个名为 PropertyChanged.Fody 的 NuGet 包。 我假设你已经熟悉 NuGet,因为你可能就是用它将 Entity Framework 支持添加到你的项目中。 安装 PropertyChanged.Fody 时,NuGet 还会安装其依赖包 Fody

假设你有一个名为 Customer 的生成的实体类,其结构如下

public partial class Customer
{
    // Various properties...
}

我们不想编辑该类/文件,因为它是由生成的。 相反,我们将利用它使用“partial”关键字声明的事实。 这允许我们通过将以下代码放在同一项目中的新文件(或任何文件)中来扩展 Customer 类。

using PropertyChanged;

[ImplementPropertyChanged]
public partial class Customer
{
    // Adding stuff here is optional.
}

就是这样! 对任何需要 INotifyPropertyChanged 的其他实体类执行相同的操作。 如果需要,可以将所有部分类放在一个文件中。

那么这如何工作呢? PropertyChanged.Fody 是一个“IL 编织器”。 安装 NuGet 包会将调用 PropertyChanged.Fody 注入到项目的构建过程中。 它本质上是一个构建后步骤,用于在构建后修改程序集。 这个编织器会将 INotifyPropertyChanged 的实现添加到具有 [ImplementPropertyChanged] 属性的每个类。

还有其他属性可用于自定义 PropertyChanged.Fody 的行为,但它们适用于单个属性,不能用于生成文件的属性。 但是,你可能希望在自己的(常规非生成)类中使用它们。 有关详细信息,请参阅 https://github.com/Fody/PropertyChanged

如果你想知道,最终程序集将不会对 PropertyChanged 产生运行时依赖,尽管存在属性、使用子句和项目引用。 此外,使用 PropertyChanged.Fody (或任何其他 Fody 插件)不会破坏 ClickOnce 部署。

© . All rights reserved.