Asp.net mvc 2 实体框架4,自定义属性。添加一些叛徒
我有一个由实体框架生成的类地址。 我在这个类中有一个属性AddressID 我想能够添加一些处理这个道具在设置过程中。 例如: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; }
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类的每个标量属性都有其自己版本的OnPropertyChanged和OnPropertyChanged方法。例如,本例中的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;
}
}
}