这应该很简单,但我还没找到方法......
我有一个遗留数据库,其名称字段存储为CHAR(50)。当它绑定到最大长度为50的TextBox时,无法插入。
如何让EF修剪这些值或至少映射到RTrim(列)?
我尝试过使用值转换器,但往返会导致背间距和问题之间的空格被删除。
请注意,我只想修剪一些字段,而不是全部。
我们使用SQL Server 2000作为数据库。很快转向SQL 2008。
谢谢!
答案 0 :(得分:1)
实体框架只能直接映射到表。您还可以映射到查看或自定义数据库查询,但在这种情况下,您的实体将成为只读,除非您还将插入,删除和更新操作映射到存储过程。
我认为您描述的问题与ANSI PADDING行为有关。它可以打开但是:
您必须在应用程序中处理修剪。例如,您可以修改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;