我从访问者中取出逻辑以使代码更清晰。我有一个表格,其名称为"答案"我有现有的代码使用实体属性"答案"。我需要尽量减少对db和代码库的更改。
要求是答案有时仅加密。我想要做的是重用Answer属性,但使用相同的列名将不同的属性映射到数据库。
这样,Answer属性始终返回解密值,但加密值保留在db中。我只需要在休息时加密的值,只需要某些"答案"是加密的,而不是全部。
如果我可以执行以下代码,那将是完美的;但是,我得到了这个例外:
{"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 >一起使用在String属性上。所以也许问题不是我试图映射到另一个属性的名称,而是我不能使用< NotMapped的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);
}
答案 0 :(得分:1)
尝试评论此行:
EFHelpers.StringHelper.DisableUnicodeForAllEntityStrings(Me, modelBuilder)
它不是框架的一部分,发生在modelCreating上,看起来它可能对Strings做了些什么(它叫做String helper)。