我有一个部分课程,我想做类似以下的事情:
[MetadataType(typeof(UserMetaData))]
public partial class Person
{
public override string PrivateData
{
get
{
return customDecrypt(base.PrivateData);
}
set
{
base.PrivateData = customEncrypt(value);
}
}
}
但上述方法无效。
有没有办法覆盖基本实体框架类的属性以允许自定义getter / setter?
答案 0 :(得分:23)
部分类与继承无关,而override
完全与继承有关。
类上的partial
关键字意味着它可以在同一个程序集中多次声明。这与将每个partial class
的每个部分复制到同一文件并删除partial
关键字完全相同。由于您无法在同一个类中两次定义相同的属性/函数/ etc,因此即使使用partial
关键字,也无法在同一个类的两个独立部分中定义它两次。
override
在派生的类中用于表示它们正在替换它们继承的基类的功能。如果它没有显式继承,则它继承自object
,允许您覆盖ToString()
(以及其他)。
执行所需操作的最佳选择是使用自定义T4模板生成加密/解密逻辑,或者在设计器中将加密属性设置为protected
或private
并手动设置添加进行解密的public
版本。
答案 1 :(得分:2)
如果您可以更改代码生成器,则可以轻松地模拟"它("覆盖"默认值)使用extrimely强大的部分方法。
答案 2 :(得分:0)
虽然您不能覆盖Entity Framework基类,但是有一种解决方法。在.edmx模型中(首先对于DB,如果代码优先,则直接在实体中),要“覆盖”属性,将Getter / Setter更改为private并重命名该属性。然后使用公共名称(该属性将不再冲突)使用属性创建部分类。
如果需要,您可以在公共部分类属性中访问重命名的私有属性。