我有一个由实体框架生成的类地址。 我在这堂课上有一个属性AddressID。
我希望能够在设定过程中为此道具添加一些处理。
EX:
public partial class Address
{
public bool _AddressID;
public bool AddressID{get return AddressID;}
set{
if(value == -1) _AddressID = null;
}
}
由于
答案 0 :(得分:2)
当然,您无法重新定义AddressID以便将自定义逻辑放入其setter中,因为您将收到编译器错误:
类型地址已包含“AddressID”的定义
但不用担心,如果你看一下EF生成的EntityObject代码(我们假设它的名字是Address),你会发现生成的Address类的每个标量属性都有自己的 OnPropertyChanging < / em> 和 OnPropertyChanged 方法。例如,在这种情况下, OnAddressIDChanging 和 OnAddressIDChanged 。
如下所示,这两种方法没有默认实现,只有声明。这完美地为您提供了执行自定义逻辑的机会
因为该物业即将改变(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;
}
}
}
顺便说一下,关于其他发布的答案 - 尽管对它们充分尊重 - 如果你想要一个生产应用程序的这个解决方案那么你就不能使用“Code First”,因为它现在只是一个CTP而且将成为下一个版本的一部分对于EF,所以它不是一个选择。
关于自定义默认代码生成,虽然这确实是可能的,因为在VS 2010中,实体框架本身也使用T4来生成设计器代码,我们可以通过更改T4来利用它,但只有当您想要从根本上改变时它才是一个选项实际上如何生成实体类,并且不能使用它来为特定实体定制setter逻辑。
答案 1 :(得分:0)
EF4中的Code First是一个选项 - 它允许您完全控制所有代码。但是,另一种选择是自定义EF4附带的EF4 T4模板。如果您的代码中某些模式一直使用,那么这将是一个很好的方法。您可以在此处详细了解如何自定义模板:Customizing Entity Classes in VS2010