值這應該是簡單的,但我暫時還沒有發現一種方式......實體框架4 - 修剪數據庫char(50)名稱上遺留數據庫
我有名字字段是一個傳統的數據庫存儲爲CHAR(50)。當它綁定到最大長度爲50的文本框時,不能插入。
如何讓EF修整這些值或至少映射到RTrim(Column)?
我試過使用值轉換器,但往返導致背部間距和單詞之間的空格被刪除的問題。
請注意,我只想修剪一些字段,而不是全部。
我們使用SQL Server 2000作爲數據庫。很快遷移到SQL 2008.
謝謝!
值這應該是簡單的,但我暫時還沒有發現一種方式......實體框架4 - 修剪數據庫char(50)名稱上遺留數據庫
我有名字字段是一個傳統的數據庫存儲爲CHAR(50)。當它綁定到最大長度爲50的文本框時,不能插入。
如何讓EF修整這些值或至少映射到RTrim(Column)?
我試過使用值轉換器,但往返導致背部間距和單詞之間的空格被刪除的問題。
請注意,我只想修剪一些字段,而不是全部。
我們使用SQL Server 2000作爲數據庫。很快遷移到SQL 2008.
謝謝!
查看數據庫連接字符串的可用屬性。我與Sybase Advantage數據庫有類似的問題,並使用它的TrimTrailingSpaces屬性解決。你的數據庫可能支持類似的東西
Data Source=\\serverx\volumex\path\db.add;User ID=user;Password=pass;ServerType=REMOTE;TrimTrailingSpaces=TRUE;
實體框架,只能夠直接映射到表。您還可以映射到查看或自定義數據庫查詢,但在這種情況下,您的實體將變爲只讀,除非您還將插入,刪除和更新操作映射到存儲過程。
我認爲你描述的問題與ANSI PADDING行爲有關。它可以打開但是:
你必須處理應用程序中的微調之前
另一種方法是處理ObjectMaterialized
事件ObjectContext
並手動修剪文本屬性,但它可能會減慢您的查詢執行速度。
我找不到EF和SQL Server。
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已經從數據庫中檢索到實體後:我與IEnumerable<T>
的擴展方法是在每個string
性能要求TrimEnd()
解決它。例如,在ToList()之後:
public IEnumerable<Country> FetchCountries()
{
return _context.Set<Country>().ToList().Trim();
}
這在SQL Server上不可用。並非所有的列都需要修剪。 – Dave 2011-03-25 13:48:05
好的,但你沒有在原始問題中指定SQL Server,只是遺留數據庫。 – 2011-04-04 22:19:28