首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让EF将空字符串持久化为NULL?

如何让EF将空字符串持久化为NULL?
EN

Stack Overflow用户
提问于 2011-06-14 08:37:04
回答 3查看 6.3K关注 0票数 4

在我的领域中,NULL和空字符串之间没有重要区别。如何让EF忽略两者之间的差异,并始终将空字符串保留为NULL?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-14 15:46:32

空字符串不是string属性的默认值,因此这意味着您的代码在某个地方设置了空字符串。在这种情况下,您有责任处理它。

如果您先在POCOs中使用代码,则可以使用自定义setter:

代码语言:javascript
复制
private string _myProperty;
public string MyProperty
{
    get { return _myProperty; }
    set
    {
        if (value == String.Empty)
        {
            _myProperty = null;
        }
        else
        {
            _myProperty = value;
        }
    }
}
票数 7
EN

Stack Overflow用户

发布于 2012-02-08 11:17:52

下面是我放在DbContext子类中的一个函数,它用null替换空字符串或空白字符串。

我仍然没有对其进行优化,因此任何性能提示都将非常感谢。

代码语言:javascript
复制
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中的TextBoxes将所有字符串属性设置为空字符串。

我尝试设置:

代码语言:javascript
复制
<TextBox 
  Text="{Binding MyStringProperty, 
           Mode=TwoWay, 
           ValidatesOnDataErrors=True, 
           TargetNullValue=''}"/>

但这并没有多大帮助。

票数 3
EN

Stack Overflow用户

发布于 2011-06-23 09:33:14

这不是实体框架的工作。

您应该在存储库中或在数据库中使用触发器执行此操作。

或者在开始时执行(例如,当数据传入时,UI,外部源等)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6337928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档