【发布时间】:2012-02-08 11:35:15
【问题描述】:
在我的领域中,NULL 和空字符串之间没有重要区别。如何让 EF 忽略两者之间的差异并始终将空字符串保留为 NULL?
【问题讨论】:
标签: entity-framework entity-framework-4.1
在我的领域中,NULL 和空字符串之间没有重要区别。如何让 EF 忽略两者之间的差异并始终将空字符串保留为 NULL?
【问题讨论】:
标签: entity-framework entity-framework-4.1
空字符串不是字符串属性的默认值,因此这意味着您的代码在某处设置了空字符串。在这种情况下,您有责任处理它。
如果您首先在 POCO 中使用代码,则可以使用自定义设置器:
private string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set
{
if (value == String.Empty)
{
_myProperty = null;
}
else
{
_myProperty = value;
}
}
}
【讨论】:
这是我放在 DbContext 子类中的一个函数,它用 null 替换空字符串或空白字符串。
我仍然没有优化它,因此非常感谢任何性能提示。
private const string StringType = "String";
private const EntityState SavingState = EntityState.Added | EntityState.Modified;
public override int SaveChanges()
{
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
var savingEntries =
objectContext.ObjectStateManager.GetObjectStateEntries(SavingState);
foreach (var entry in savingEntries)
{
var curValues = entry.CurrentValues;
var fieldMetadata = curValues.DataRecordInfo.FieldMetadata;
var stringFields = fieldMetadata.Where(f =>
f.FieldType.TypeUsage.EdmType.Name == StringType);
foreach (var stringField in stringFields)
{
var ordinal = stringField.Ordinal;
var curValue = curValues[ordinal] as string;
if (curValue != null && curValue.All(char.IsWhiteSpace))
curValues.SetValue(ordinal, null);
}
}
return base.SaveChanges();
}
优化注意事项:
string 类型属性我试图查找一些内置类型的枚举,但没有找到我正在使用 Silverlight,并且 UI 中的 TextBoxes 将所有字符串属性设置为空字符串。
我试过设置:
<TextBox
Text="{Binding MyStringProperty,
Mode=TwoWay,
ValidatesOnDataErrors=True,
TargetNullValue=''}"/>
但这并没有太大帮助。
【讨论】:
这不是实体框架的工作。
您应该在您的存储库中执行此操作,或者在带有触发器的数据库中执行此操作。
或者一开始就做(例如当数据进来时,UI,外部源等)
【讨论】: