Asp.net mvc 2 实体框架4,自定义属性。添加一些叛徒

Asp.net mvc 2 实体框架4,自定义属性。添加一些叛徒,asp.net-mvc-2,entity-framework-4,Asp.net Mvc 2,Entity Framework 4,我有一个由实体框架生成的类地址。 我在这个类中有一个属性AddressID 我想能够添加一些处理这个道具在设置过程中。 例如: public partial class Address { public bool _AddressID; public bool AddressID{get return AddressID;} set{ if(value == -1) _AddressID = null; }

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

我想能够添加一些处理这个道具在设置过程中。 例如:

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

谢谢

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

当然,您不能为了将自定义逻辑放入其setter而重新定义AddressID,因为您将得到编译器错误:
类型地址已包含“AddressID”的定义

但是不用担心,如果您查看EntityObject的EF生成代码(假设其名称为Address),您将看到生成的Address类的每个标量属性都有其自己版本的OnPropertyChangedOnPropertyChanged方法。例如,本例中的OnAddressDischange和OnAddressDischanged。

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


这就是实体模型设计器代码的外观(形上):


因此,连接自定义代码所需的全部操作是:

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


顺便说一句,关于其他已发布的答案,请恕我直言,如果您想在生产应用程序中使用此解决方案,那么您不能使用“代码优先”,因为目前它只是一个CTP,并且将是EF下一版本的一部分,因此它不能成为一个选项

关于自定义默认代码生成,虽然这确实是可能的,因为在VS 2010中,实体框架本身也使用T4生成设计器代码,我们可以通过更改T4来利用它,但是,只有当您想从根本上改变实体类的生成方式,并且不能使用它为特定实体定制setter逻辑时,才可以选择它。

您的解决方案非常适合。但当我尝试时,IIS停止运行,我的网页停止响应。你知道为什么吗?对不起,我忘了在部分函数中添加条件。不客气。我很高兴这有帮助。顺便说一句,在自定义OnAddressChanged方法中放置一个断点,并查看如何调用它。如果您还有其他问题,请告诉我:)
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;
        }
    }       
}