11

我有一个部分课程,我想做如下的事情:

[MetadataType(typeof(UserMetaData))]
public partial class Person
{
    public override string PrivateData
    {
        get
        {
            return customDecrypt(base.PrivateData);
        }
        set
        {
            base.PrivateData = customEncrypt(value);
        }
    }
}

但是,上述方法不起作用。

有没有办法覆盖基础实体框架类的属性以允许自定义 getter/setter?

4

3 回答 3

28

部分类与继承无关,override完全是关于继承的。

类上的partial关键字只是意味着它可以在同一个程序集中多次声明。这与将 every 的每个部分复制partial class到同一个文件并删除partial关键字完全相同。partial由于您不能在同一个类中定义相同的属性/函数/等两次,因此即使使用关键字,您也不能在同一类的两个单独部分中定义它两次。

override另一方面,在派生类中使用它来表示它们正在替换它们所继承的基类的功能。如果它没有显式继承,它继承自object,它允许您覆盖ToString()(以及其他)。

您最好的选择是使用自定义 T4 模板来生成加密/解密逻辑,或者在设计器中protectedprivate在设计器中设置加密属性并手动添加public执行解密的版本。

于 2013-03-04T18:09:24.520 回答
2

如果您可以更改代码生成器,则可以使用极其强大的部分方法轻松“模拟”它(“覆盖”默认值) 。

https://msdn.microsoft.com/en-us/library/wa80x488.aspx

于 2015-08-07T20:34:10.880 回答
1

虽然您不能覆盖 Entity Framework 基类,但有一种变通方法。在 .edmx 模型中(对于 DB 优先,如果代码优先,则直接在实体中)在要“覆盖”的属性上将 Getter / Setter 更改为私有并重命名属性。然后使用公共名称创建具有属性的部分类,这将不再冲突。

在公共部分类属性中,如果需要,您将能够访问私有重命名属性。

于 2019-09-09T08:40:47.823 回答