需要将 EF 实体 属性 映射到使用另一个 属性 名称的列

Need to map an EF entity property to a column using another property's name

从访问器中取出逻辑以使代码更清晰。我有一个 table 和一个名为 "Answer" 的列,并且我有使用实体 属性 "Answer" 的现有代码。我需要尽量减少对数据库和代码库的更改。

要求Answer只是偶尔加密。我想做的是重用答案 属性,但使用相同的列名将不同的 属性 映射到数据库。

这样,答案 属性 总是 returns 一个解密值,但加密值保存在数据库中。我只需要静态加密的值,只有某些 "answers" 被加密,而不是全部。

如果能实现下面的代码就完美了;但是,我得到这个例外:

{"The property 'Answer' is not a declared property on type 'NewHireAnswer'. Verify that the property has not been explicitly excluded from the model by using the Ignore method or NotMappedAttribute data annotation. Make sure that it is a valid primitive property."}

我也试过在 DbContext 的 OnModelCreating 方法中手动配置列映射,但有同样的例外。

[NotMapped]
public string Answer 
{
    get { return _internalAnswer; }
    set { InternalAnswer = value; }
}

private string _internalAnswer;
[Column("Answer")]
public string InternalAnswer 
{
    get { return _internalAnswer; }
    set { _internalAnswer = value; }
}

也许,唯一的方法是重命名该列,但是,正如我所说,我需要减少这种类型的配置更改。似乎我应该能够做我正在尝试的事情。

更新: 我注意到在 VB.Net 示例中,属性 setter 从未与 <NotMapped> 字符串属性。所以也许问题不在于我试图映射到另一个 属性 的名字,而是我不能将字符串 属性 与 <NotMapped[ 一起使用=42=]> 和 setter。异常消息确实说“确保它是一个有效的原语属性”。

这似乎是一个非常奇怪的约束组合。我应该可以使用非映射 属性 来 set/get,或者其他什么,不是吗?

更新: 我创建了两个新的代码优先项目,一个 c# 和一个 Vb.Net,我是尝试做上面的工作正常。这让我相信这是一个配置问题。

这是我的 DbContext 的 OnModelCreating 方法中的内容:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    EFHelpers.StringHelper.DisableUnicodeForAllEntityStrings(this, modelBuilder);

    TurnOnCascadeDeletes(modelBuilder);
    TurnOffCascadeDeletes(modelBuilder);
    MapTables(modelBuilder);

}

尝试注释掉这一行:

EFHelpers.StringHelper.DisableUnicodeForAllEntityStrings(Me, modelBuilder)

它不是框架的一部分,发生在 modelCreating 上,看起来它可能会对字符串做一些事情(它称为字符串助手)。