实体框架4 - 修复遗留数据库上Name的数据库Char(50)值

时间:2011-03-23 20:46:08

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

这应该很简单,但我还没找到方法......

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

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

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

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

我们使用SQL Server 2000作为数据库。很快转向SQL 2008。

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:1)

我找不到使用EF和SQL Server的方法。我使用IEnumerable<T>上的扩展方法解决了这个问题,该方法在每个TrimEnd()属性上调用string

    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();
    }

答案 2 :(得分:0)

查看数据库连接字符串的可用属性。我在Sybase Advantage数据库中遇到了类似的问题,并使用TrimTrailingSpaces属性解决了这个问题。您的数据库可能支持类似的东西。

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

http://www.connectionstrings.com/