如何获得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,外部源等时)