【发布时间】:2015-03-12 14:19:16
【问题描述】:
我从访问器中取出逻辑以使代码更简洁。我有一个包含名为“Answer”的列的表,并且我有使用实体属性“Answer”的现有代码。我需要尽量减少对数据库和代码库的更改。
要求仅在某些情况下对 Answer 进行加密。我想做的是重用 Answer 属性,但使用相同的列名将不同的属性映射到数据库。
这样,Answer 属性总是返回一个解密的值,但加密的值会保存在数据库中。我只需要静态加密的值,并且只有某些“答案”被加密,而不是全部。
如果我能做下面的代码就完美了;但是,我得到了这个例外:
{"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 示例中,属性设置器从未与 NotMapped> 一起用于字符串属性。所以也许问题不在于我试图映射到另一个属性的名称,而是我不能使用带有 NotMapped> 和 setter 的 String 属性。异常消息确实说“确保它是一个有效的原始属性”。
这似乎是一个非常奇怪的约束组合。我应该能够拥有可用于设置/获取或其他任何东西的非映射属性,不是吗?
更新:我创建了两个新的代码优先项目,一个 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);
}
【问题讨论】:
-
您现在不能在 LINQ 查询中直接使用
Answer。 -
已经考虑过了,在这种情况下这不是问题。在这种情况下,答案是不相关的,我真的永远不会将值本身用作条件的一部分。
-
那么你什么时候收到这个错误?
-
我会想到 onModelCreating,但根据我的调用堆栈,这只是第一次尝试在 DBContext 中使用 DBSet。
标签: ef-code-first entity-framework-6 data-annotations