如何解决如何获得EF将空字符串持久化为NULL?
| 在我的领域中,NULL和空字符串之间没有重要区别。如何让EF忽略两者之间的差异,并始终将空字符串保留为NULL?解决方法
空字符串不是字符串属性的默认值,因此这意味着您的代码正在某个地方设置空字符串。在这种情况下,您有责任进行处理。
如果您首先将代码与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
类型的属性,我试图查找一些内置类型的枚举,但没有找到
缓存类型的字符串字段(可能是不必要的,将不得不反编译并查看原始impl的作用
按实体类型排序结果,备份迭代实体类型,如果下一个迭代实体是相同类型,则使用先前的元数据,再次,如果元数据仍然存在,则性能会更便宜
限制字符串长度以进行空格检查-即,如果字符串长度> x,则跳过检查其是否为空格字符串
我正在使用Silverlight,并且UI中的TextBox
将所有字符串属性设置为空字符串。
我尝试设置:
<TextBox
Text=\"{Binding MyStringProperty,Mode=TwoWay,ValidatesOnDataErrors=True,TargetNullValue=\'\'}\"/>
但这并没有太大帮助。
, 那不是实体框架的工作。
您应该在存储库中或在带有触发器的数据库中执行此操作。
或一开始就做(例如,当数据输入,UI,外部源等时)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。