【问题标题】:Entity Framework 4 - Trim Database Char(50) value for Name on legacy databaseEntity Framework 4 - Trim Database Char(50) value for Name on legacy database
【发布时间】:2011-03-23 20:46:07
【问题描述】:

这个应该很简单,但是我还没有找到方法……

我有一个旧数据库,其中的名称字段存储为 CHAR(50)。当 this 绑定到最大长度为 50 的 TextBox 时,您无法插入。

如何使 EF 修剪这些值或至少映射到 RTrim(Column)?

我尝试过使用值转换器,但往返会导致后退空格和单词之间的空格被删除的问题。

请注意,我只想修剪一些字段,而不是全部。

我们使用 SQL Server 2000 作为数据库。即将迁移到 SQL 2008。

谢谢!

【问题讨论】:

    标签: sql-server wpf database entity-framework binding


    【解决方案1】:

    实体框架只能直接映射到表。您还可以映射到视图或自定义数据库查询,但在这种情况下,您的实体将变为只读,除非您还将插入、删除和更新操作映射到存储过程。

    我认为您描述的问题与 ANSI PADDING 行为有关。可以开启但是:

    • 不推荐。在 SQL Server 的未来版本中,这将被视为错误。
    • 必须在创建列之前进行配置

    您必须在应用程序中处理修剪。例如,您可以修改 T4 模板(如果您使用它们)来修剪字符串属性。不确定它如何与 WPF 一起使用,但您可能可以继承文本框并覆盖 Text 属性以修剪值。

    另一种方法是处理ObjectContext 上的ObjectMaterialized 事件并手动修剪文本属性,但这会减慢查询的执行速度。

    【讨论】:

      【解决方案2】:

      没有办法用我发现的 EF 和 SQL Server 做到这一点。我使用IEnumerable<T> 上的扩展方法解决了这个问题,该方法在每个string 属性上调用TrimEnd()

          public static IEnumerable<TEntity> Trim<TEntity>(this IEnumerable<TEntity> collection)
          {
              Type type = typeof(TEntity);
      
              IEnumerable<PropertyDescriptor> properties = TypeDescriptor.GetProperties(type).Cast<PropertyDescriptor>()
                  .Where(p => p.PropertyType == typeof(string));
      
              foreach (TEntity entity in collection)
              {
                  foreach (PropertyDescriptor property in properties)
                  {
                      string value = (string) property.GetValue(entity);
      
                      if (!String.IsNullOrEmpty(value))
                      {
                          value = value.TrimEnd();
                          property.SetValue(entity, value);
                      }
                  }
              }
      
              return collection;
          }
      

      只要确保在 EF 从数据库中检索到实体后调用它即可。例如 ToList() 之后:

          public IEnumerable<Country> FetchCountries()
          {
              return _context.Set<Country>().ToList().Trim();
          }
      

      【讨论】:

        【解决方案3】:

        查看数据库连接字符串的可用属性。我对 Sybase Advantage 数据库有类似的问题,并用它的 TrimTrailingSpaces 属性解决了。您的数据库可能支持类似的东西。

        Data Source=\\serverx\volumex\path\db.add;User ID=user;Password=pass;ServerType=REMOTE;TrimTrailingSpaces=TRUE;
        

        http://www.connectionstrings.com/

        【讨论】:

        • 这在 SQL Server 上不可用。并非所有列都需要修剪。
        • 好的,但是您没有在原始问题中指定 SQL Server,只是旧数据库。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多