2011-06-14 56 views
4

在我的域中,NULL和空字符串之间没有重要的区别。如何让EF忽略两者之间的差异并始终将空字符串保留为NULL?所以这意味着你的代码是什么地方设置空字符串如何获得EF将空字符串保留为NULL?

+0

的可能重复[有没有做实体框架恢复空字符串为空的选项?(http://stackoverflow.com/questions/1119615/is-there-an-option-to-make-entity-framework -revert-empty-strings-to-null) – 2014-08-18 18:09:36

回答

5

空字符串不是默认字符串属性值。在这种情况下,您有责任处理它。

如果使用代码首先波苏斯您可以使用定制的setter:

private string _myProperty; 
public string MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     if (value == String.Empty) 
     { 
      _myProperty = null; 
     } 
     else 
     { 
      _myProperty = value; 
     } 
    } 
} 
+0

请看看[我的功能](http://stackoverflow.com/a/9187411/75500),我很乐意听到类似专家的一两个提示您。 – Shimmy 2012-02-08 03:18:39

0

这不是实体框架的工作。

你应该这样做在你的仓库,或与触发器数据库。

,或者在开始做(例如,当数据到来时,UI,外部电源等)

3

这是一个功能,我把我的DbContext子替换为空或空白字符串用空。

我还是没有优化就那么任何性能的提示将非常赞赏。

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通过实体类型,备份重复实体类型确实
  • 无序结果,如果下一个迭代的实体是同一类型,使用以前metad ATA,再次,如果元数据是反正有,性能更便宜的它是空白支票
  • 限制字符串长度的方式 - 如果即一个字符串长度> X,跳过检查是否它是一个空白字符串或不

我正在使用Silverlight,而UI中的TextBox es将所有字符串属性设置为空字符串。

我试过设置:

<TextBox 
    Text="{Binding MyStringProperty, 
      Mode=TwoWay, 
      ValidatesOnDataErrors=True, 
      TargetNullValue=''}"/> 

但它并没有多大帮助。

相关问题