【问题标题】:Entity Framework 4 , Custom Properties . Add some traitement实体框架 4、自定义属性。添加一些特质
【发布时间】:2010-09-13 08:15:20
【问题描述】:

我有一个由实体框架生成的类地址。 我在这个类中有一个属性 AddressID。

我希望能够在设置过程中为这个道具添加一些处理。 前:

  public partial class Address
  {
       public bool _AddressID;
       public bool AddressID{get return AddressID;}
       set{
            if(value == -1) _AddressID = null;
       }
   }

谢谢

【问题讨论】:

    标签: asp.net-mvc-2 entity-framework-4


    【解决方案1】:

    当然,您不能重新定义您的 AddressID 以将您的自定义逻辑放入其设置器中,因为您会收到编译器错误:
    Address 类型已经包含“AddressID”的定义

    但是不用担心,如果您查看 EF 为您的 EntityObject 生成的代码(假设它的名称是 Address),您会看到生成的 Address 类的每个标量属性都有自己的 OnPropertyChangingOnPropertyChanged 方法。例如,在这种情况下,OnAddressIDChangedOnAddressIDChanged

    正如您在下面看到的,这两种方法没有默认实现,只有一个声明。这完美地为您提供了执行自定义逻辑的机会 由于属性即将更改 (PropertyChanging) 以及在属性之后 值已更改 (PropertyChanged)。

    // From the designer code for Address class:
    partial void OnAddressIDChanging(global::System.Int32 value);
    partial void OnAddressIDChanged();
    


    这就是您的实体模型设计器代码的样子(假设地):

    public global::System.Int32 AddressID {
        get {
            return _AddressID;
        }
        set {
            if (_AddressID != value) {
                // OnPropertyChanging method get called here:
                OnAddressIDChanging(value);
    
                ReportPropertyChanging("AddressID");
                _AddressID = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("AddressID");
    
                // OnPropertyChanged get called here:
                OnAddressIDChanged();
            }
        }
    }
    


    因此,为了连接您的自定义代码,您需要做的就是:

    public partial class Address {
        partial void OnAddressIDChanged() {
            if(AddressID == -1) {            
                AddressID = 0;
            }
        }       
    }
    



    顺便说一句,关于其他已发布的答案 - 请充分尊重他们 - 如果您希望将此解决方案用于生产应用程序,那么您不能使用“代码优先”,因为它现在只是一个 CTP,并将成为下一个版本的一部分对于 EF,因此它不是一个选项。
    关于自定义默认代码生成,虽然这确实是可能的,因为在 VS 2010 中,Entity Framework 本身也使用 T4 进行设计器代码生成,我们可以通过更改 T4 来利用它,但只有当你想从根本上改变它才是一个选项实体类一般是如何生成的,您不能使用它来自定义特定实体的设置器逻辑。

    【讨论】:

    • 您的解决方案喜欢 非常非常好。但是当我尝试它时,IIS 停止运行,我的网页停止响应。你知道为什么吗?
    • 对不起,我忘了在偏函数中添加条件。
    • 不客气。我很高兴它有所帮助。顺便说一句,在您的自定义 OnAddressIDChanged 方法中放置一个断点,看看它是如何被调用的。如果您还有其他问题,请告诉我:)
    【解决方案2】:

    EF4 中的 Code First 是一个选项 - 它允许您完全控制所有代码。但是,另一种选择是自定义 EF4 附带的 EF4 T4 模板。如果您的代码中有某些一直使用的模式,那么这将是一个好方法。您可以在此处阅读有关如何自定义模板的更多信息:Customizing Entity Classes in VS2010

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2010-11-06
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多