2011-03-23 76 views
3

值這應該是簡單的,但我暫時還沒有發現一種方式......實體框架4 - 修剪數據庫char(50)名稱上遺留數據庫

我有名字字段是一個傳統的數據庫存儲爲CHAR(50)。當它綁定到最大長度爲50的文本框時,不能插入。

如何讓EF修整這些值或至少映射到RTrim(Column)?

我試過使用值轉換器,但往返導致背部間距和單詞之間的空格被刪除的問題。

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

我們使用SQL Server 2000作爲數據庫。很快遷移到SQL 2008.

謝謝!

回答

0

查看數據庫連接字符串的可用屬性。我與Sybase Advantage數據庫有類似的問題,並使用它的TrimTrailingSpaces屬性解決。你的數據庫可能支持類似的東西

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

http://www.connectionstrings.com/

+0

這在SQL Server上不可用。並非所有的列都需要修剪。 – Dave 2011-03-25 13:48:05

+0

好的,但你沒有在原始問題中指定SQL Server,只是遺留數據庫。 – 2011-04-04 22:19:28

1

實體框架,只能夠直接映射到表。您還可以映射到查看或自定義數據庫查詢,但在這種情況下,您的實體將變爲只讀,除非您還將插入,刪除和更新操作映射到存儲過程。

我認爲你描述的問題與ANSI PADDING行爲有關。它可以打開但是:

  • 不推薦。在未來的SQL服務器版本中,它將被視爲錯誤。您創建一個列

你必須處理應用程序中的微調之前

  • 必須進行配置。例如,您可以修改T4模板(如果使用它們)來修剪字符串屬性。不知道它如何與WPF一起工作,但您可能會繼承文本框並覆蓋Text屬性來修剪值。

    另一種方法是處理ObjectMaterialized事件ObjectContext並手動修剪文本屬性,但它可能會減慢您的查詢執行速度。

  • 1

    我找不到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(); 
        }