【发布时间】:2015-02-12 13:05:48
【问题描述】:
在旧数据库中,NULL 值有时存储为字符串 NULL 和/或“x”。
我如何告诉 EF 我希望它自动将这些“占位符值”转换为 NULL?
更新:
我想通过两次拥有相同的属性来避免模型中的歧义/意外复杂性。 (如果人们可以获取/设置LegacyColumn,他们就会这样做并且抽象被破坏了)
【问题讨论】:
标签: c# entity-framework entity-framework-6
在旧数据库中,NULL 值有时存储为字符串 NULL 和/或“x”。
我如何告诉 EF 我希望它自动将这些“占位符值”转换为 NULL?
更新:
我想通过两次拥有相同的属性来避免模型中的歧义/意外复杂性。 (如果人们可以获取/设置LegacyColumn,他们就会这样做并且抽象被破坏了)
【问题讨论】:
标签: c# entity-framework entity-framework-6
您可以基于未映射到数据库并执行所需转换的现有属性创建新属性。假设列名为Foo,您可以使用以下代码:
[Column("Foo")]
public String FooWithWeirdNullValues { get; set; }
[NotMapped]
public String Foo {
get {
return FooWithWeirdNullValues == "NULL" || FooWithWeirdNullValues == "x"
? null : FooWithWeirdNullValues;
}
set { FooWithWeirdNullValues = value; }
}
然后在您的代码中使用未映射的属性来访问Foo 列的值。
您可能想为FooWithWeirdNullValues 选择另一个名称,例如LegacyFoo 或其他。您可以选择任何名称,只要您使用 Column 属性将其映射到数据库中的正确列即可。
如果需要,您可以将 FooWithWeirdNullValues 设为私有,以免污染您的模型。这需要对DbContext 进行一些更改,如an answer on Stack Overflow on how to map private properties using code first 中所述。
【讨论】:
EditorBrowsable(Never) 能解决这个问题,但它没有。