这应该很简单,但我还没有找到一个方法...
我有一个遗留数据库,其name字段存储为CHAR(50)。绑定到最大长度为50的TextBox时,不能插入。
如何让EF修剪这些值,或者至少映射到RTrim(列)?
我试过使用值转换器,但往返过程导致后退和单词之间的空格被删除的问题。
请注意,我只想裁剪一些字段,而不是全部。
我们使用SQL Server 2000作为数据库。很快就会迁移到SQL 2008。
谢谢!
发布于 2011-03-25 22:27:01
实体框架只能直接映射到表。您也可以映射到视图或自定义DB查询,但在这种情况下,您的实体将变为只读,除非您还将插入、删除和更新操作映射到存储过程。
我认为您描述的问题与ANSI填充行为有关。它可以打开,但是:
之前配置列
您必须在应用程序中处理修剪。例如,您可以修改T4模板(如果使用它们)来修剪字符串属性。不确定它如何与WPF一起工作,但您可能可以继承文本框并重写text属性来修剪值。
另一种方法是处理ObjectContext上的ObjectMaterialized事件并手动修剪文本属性,但这会减慢查询的执行速度。
发布于 2011-04-04 23:53:09
据我所知,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();
}发布于 2011-03-24 05:15:28
看一下数据库连接字符串的可用属性。我在使用Sybase Advantage数据库时遇到了类似的问题,并用它的TrimTrailingSpaces属性解决了这个问题。您的数据库可能支持类似的内容。
Data Source=\\serverx\volumex\path\db.add;User ID=user;Password=pass;ServerType=REMOTE;TrimTrailingSpaces=TRUE;http://www.connectionstrings.com/
https://stackoverflow.com/questions/5411413
复制相似问题