1

我有一个使用标准模板生成的名为 Account 的 EF 5 实体。

它有一个属性 AccountTypeId。

当它发生变化时,我需要一个通知,以便可以更新另一个字段。

这通常是如何完成的?这只有一个属性需要,所以我不想使用修改后的模板。

AccountTypeId 绑定到 WinForms 的 UI 中的 ComboBox,因此它不是真正的 MVVM 应用程序,就像我通常在 WPF 中所做的那样。

4

2 回答 2

2

您可以使用名为PropertyChanged.Fody的 NuGet 包通过几行代码来完成此操作。包文档在GitHub 上。请参阅我的 CodeProject 提示“将 INotifyPropertyChanged 添加到实体框架类”。

我应该指出,该技术将为类中的每个属性实现 INPC。如果您只希望 INPC 用于单个属性并且您不想修改 T4 模板或 EDMX 文件,那么您可以利用实体​​类是使用“partial”关键字生成的事实,允许您添加“包装器”像 Erik Philips 描述的单独(非生成)文件中的属性。您必须修改现有代码以引用包装器属性,但当您重新生成模型或实体时,不会有任何问题。

于 2014-12-16T17:49:22.960 回答
2

一种方法是转到 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 步骤。

于 2013-09-16T19:42:42.070 回答