我有一个使用标准模板生成的名为 Account 的 EF 5 实体。
它有一个属性 AccountTypeId。
当它发生变化时,我需要一个通知,以便可以更新另一个字段。
这通常是如何完成的?这只有一个属性需要,所以我不想使用修改后的模板。
AccountTypeId 绑定到 WinForms 的 UI 中的 ComboBox,因此它不是真正的 MVVM 应用程序,就像我通常在 WPF 中所做的那样。
我有一个使用标准模板生成的名为 Account 的 EF 5 实体。
它有一个属性 AccountTypeId。
当它发生变化时,我需要一个通知,以便可以更新另一个字段。
这通常是如何完成的?这只有一个属性需要,所以我不想使用修改后的模板。
AccountTypeId 绑定到 WinForms 的 UI 中的 ComboBox,因此它不是真正的 MVVM 应用程序,就像我通常在 WPF 中所做的那样。
您可以使用名为PropertyChanged.Fody的 NuGet 包通过几行代码来完成此操作。包文档在GitHub 上。请参阅我的 CodeProject 提示“将 INotifyPropertyChanged 添加到实体框架类”。
我应该指出,该技术将为类中的每个属性实现 INPC。如果您只希望 INPC 用于单个属性并且您不想修改 T4 模板或 EDMX 文件,那么您可以利用实体类是使用“partial”关键字生成的事实,允许您添加“包装器”像 Erik Philips 描述的单独(非生成)文件中的属性。您必须修改现有代码以引用包装器属性,但当您重新生成模型或实体时,不会有任何问题。
一种方法是转到 EDMX 并将字段重命名为 AccountTypeID_Internal(例如),然后在 EDMX 中将属性设置为Private
. 然后创建一个部分类。
生成的 Account.cs 应如下所示:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace <yournamespace>
{
using System;
using System.Collections.Generic;
public partial class Account
{
private int AccountTypeId_Internal { get; set; }
// other auto generated properties
}
}
Account.Partial.Cs
public partial class Account : INotifyPropertyChanged
{
public Int AccountTypeId
{
get
{
return this.AccountTypeId_Internal;
}
set
{
this.AccountTypeId_Internal = value;
// Do INotifyPropertyChangedLogic
}
}
// Implement INotifyPropertyChanged
}
这样做的好处是您已经编写的代码根本不需要更改。不利的一面是,如果您从 edmx 中删除帐户并重新添加它,您将不得不再次执行 edmx 步骤。