首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Entity Framework 4-修剪数据库Char(50)值作为遗留数据库上的名称

Entity Framework 4-修剪数据库Char(50)值作为遗留数据库上的名称
EN

Stack Overflow用户
提问于 2011-03-24 04:46:08
回答 3查看 2K关注 0票数 3

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

我有一个遗留数据库,其name字段存储为CHAR(50)。绑定到最大长度为50的TextBox时,不能插入。

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

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

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

我们使用SQL Server 2000作为数据库。很快就会迁移到SQL 2008。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2011-03-25 22:27:01

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

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

  • 不建议这样做。在SQL server的未来版本中,它将被视为错误。必须在创建列

之前配置列

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-04-04 23:53:09

据我所知,EF和SQL Server无法做到这一点。我用IEnumerable<T>上的一个扩展方法解决了这个问题,该方法在每个string属性上调用TrimEnd()

代码语言:javascript
运行
复制
    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()之后:

代码语言:javascript
运行
复制
    public IEnumerable<Country> FetchCountries()
    {
        return _context.Set<Country>().ToList().Trim();
    }
票数 1
EN

Stack Overflow用户

发布于 2011-03-24 05:15:28

看一下数据库连接字符串的可用属性。我在使用Sybase Advantage数据库时遇到了类似的问题,并用它的TrimTrailingSpaces属性解决了这个问题。您的数据库可能支持类似的内容。

代码语言:javascript
运行
复制
Data Source=\\serverx\volumex\path\db.add;User ID=user;Password=pass;ServerType=REMOTE;TrimTrailingSpaces=TRUE;

http://www.connectionstrings.com/

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

https://stackoverflow.com/questions/5411413

复制
相关文章

相似问题

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