【问题标题】:Entity Framework Code First, nonempty setter or getter?实体框架代码优先,非空 setter 或 getter?
【发布时间】:2013-02-04 20:36:27
【问题描述】:

我正在使用 EF Code First 项目,一切都很好。我有一个简单的类,客户。在我的客户类中,我有一个要加密的字段(是的,我知道我可以在数据库级别加密,但要求我在域/代码级别进行加密),所以我希望我可以执行以下操作:

public class Customer
{
    public int CustomerID { get; set; }      
    public string FieldToEncrypt { get; set { _FieldToEncrypt = MyEncryptionFunction.Encrypt(); } }
}

但是,我假设如果 setter 有定义,实体框架代码首先可能会在生成模式时忽略该属性。所以我的问题是,有没有办法使用提供的 getter/setter 执行 EF Code First,或者我应该将此功能移动到构造函数中?我是否应该覆盖在保存 Context 时发生的方法/事件之一?

编辑************ ********

请注意,我使用 DataService 通过 OData 协议服务传输数据。这会自动生成插入/更新/选择方法。一些建议需要创建第二个属性,但 DataService 类似乎没有通过 NotMapped 属性。这让我之前的问题有点纠结。

【问题讨论】:

  • 如果您要对字符串进行加密,我建议将其尽可能靠近输入。即在你做FieldToEncrypt = "asdf";(在setter中处理加密)的地方,更改为FieldToEncrypt = MyEncryptionFunction.Encrypt("asdf");
  • 你试过了吗? SO上有许多类似的答案表明这以您正在寻找的方式开箱即用。见stackoverflow.com/questions/11962532/…stackoverflow.com/questions/8990319/…
  • 您提供的第二个链接似乎更接近我的需要。但是,他说的是“不映射”该领域。我仍然希望该字段被映射。我只想在值卡在数据库中之前转换映射的值。我想我有一个更深层次的问题,那就是:在EF Code First中,代码是否在插入之前/之后调用getter和setter?

标签: c# entity-framework ef-code-first


【解决方案1】:
public class Customer 
{
    public int CustomerID { get; set; }        
    public string EncryptedField { get; private set; }

    [NotMapped]
    public string Field
    {
        get { return MyEncryptionFunction.Decrypt(EncryptedField); }
        set { EncryptedField = MyEncryptionFunction.Encrypt(value); }
    } 
}

【讨论】:

  • 好的,但我正在精神上尝试计算 GET 与 SET。那么当实体框架试图将数据写入数据库时​​,它会调用对象上的“GET”吗?如果是这样,数据库中的数据将被解密然后插入到数据库中。在这个例子中,我担心数据只在内存中加密,而不是在持久化时加密。我尝试了 SET 语句,它的工作方式令人惊讶地完全符合我的要求。 'NotMapped' 注释提供了什么?它是否告诉框架将该列保留在数据库中?如果是这样,它不适用于我的示例。
  • 在此示例中,数据库中只有两列:CustomerID 和 EncryptedField(具有加密字段值)。未加密的数据不会存储在任何地方——既不在数据库中,也不在内存中。 NotMapped 注释告诉 EF 跳过属性并且不在数据库中为该属性生成列
  • 好的。但是,与其将其拆分为两个字段,一个未映射,一个映射,我可以只使用一个映射的字段吗?
  • @Richthofen setter 将在从数据库读取数据到您的属性时执行。因此,如果您想存储加密数据,请考虑您将在您的领域中获得什么 - 数据加密两次。
  • 问题已更新; NotMapped 会导致一些问题,因为我使用 DataService 根据我的数据上下文自动生成服务,而 DataService 会忽略 NotMapped 属性。
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 2011-08-05
  • 1970-01-01
  • 2016-10-17
  • 2017-09-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多