将 INotifyPropertyChanged 添加到 Entity Framework 类
为 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 部署。