2014-04-23 96 views
0

編輯的清晰度自動= RTRIM字符串的實體框架,ServiceStack OrmLite,PetaPoco等

我一直在尋找的ORM的最後一個星期,以及試圖決定,如果我想打擾他們。在一天結束時,似乎有大約十幾個有價值的競爭者,其中大多數很難區分。我最終決定了EF,OrmLite和PetaPoco的潛在三人,所有這些看起來都不錯。

我一直在尋找的一個特性是能夠奇蹟般地配置代碼生成器,以便在生成的POCO中自動修剪所有字符串,而不對DB進行任何更改。我有一個數據庫,數以千計的記錄遍佈數百個字段,每個字符串字段在其結尾處都有一堆空格,這是出於傳統原因。那些需要從結果POCOS /實體剝離,使處理更加難看,,但我不能對數據庫(這不是我的),所以我想知道是否有簡單的方法做到這一點。

使用實體框架我對數據庫優先和模型優先設計的過程稍微看了一下,看起來您可能會調整T4模板代碼以根據具體情況生成適當的代碼。這似乎是可行的,但我不想重新發明輪子,如果有人已經做到了。我只想擁有處理該問題的代碼。

對於其他ORM,我可能會把他們拉到家裏,弄清楚他們是如何工作的,並插入某種邏輯來實現這種魔法。

那麼有沒有人有一個ORM的建議,有一個配置開關,可以自動修剪所有字符串?這將使數據庫更容易處理,百分百肯定在最後這些額外的空間中沒有任何價值。

+0

查看此答案:http://stackoverflow.com/a/20141289/150342。我會尋找一個解決方案,修復數據庫,而不是:http://stackoverflow.com/questions/507869/trim-all-database-fields – Colin

+0

這是一個很好的建議,但我不能在這種情況下。 ( –

+0

)你不允許編輯數據?一切都是隻讀的嗎?你可以添加只讀視圖並映射到它們嗎? – Colin

回答

0

實體框架(和可能PetaPoco我本人並不認識),你應該能夠修改T4模板和添加只讀屬性到你的實體,返回數據庫相關屬性的修整值。

public string Name 
{ 
    get { return this.DbName.TrimEnd(); } 
} 

但是......

  • 你必須找到一種方法來進行字符串屬性做到這一點只(我想,在T4模板是可見的方法之一,可用於該,但我不確定)。

  • 修改T4模板是發佈更新時可能必須重新執行的操作。

  • 您不能直接在LINQ-to-entities中使用只讀屬性,因爲EF無法將它們轉換爲SQL。您將在撥打AsEnumerable()後不得不使用它們。

+0

這是我可能嘗試的一種方法,實際上我可能會做CodeFirst,所以我認爲我應該可以做一些事情這樣做,並做一個Setter以及去其他的方式,我會試驗它,謝謝你的建議 –

1

認爲這是一個很好的功能,所以我剛剛加入這,你現在可以添加自定義過濾器字符串,如:

OrmLiteConfig.StringFilter = s => s.TrimEnd(); 

public class Poco 
{ 
    public string Name { get; set; } 
} 

using (var db = OpenDbConnection()) 
{ 
    db.DropAndCreateTable<Poco>(); 

    db.Insert(new Poco { Name = "Value with trailing " }); 
    var row = db.Select<Poco>().First(); 

    Assert.That(row.Name, Is.EqualTo("Value with trailing")); 
} 

這將是在未來V4 .0.19+ NuGet發佈ServiceStack,現在可在ServiceStack's MyGet Feed上獲得。

+1

黨,這是快速;))我一直在試圖決定一個ORM,反彈和在上週的OrmLite和EF之間。無論如何,我傾向於OrmLite,但我認爲這是打破駱駝背部的殺手鐗。優秀作品。我會下載它,並嘗試在第一次機會。 –

+0

我在MyGet Feed中看不到SQL Server版本。任何想法何時可用?謝謝。 –

+0

@WadeHatler所有的軟件包在那裏,這裏的[ServiceStack.OrmLite.SqlServer](https://www.myget.org/feed/servicestack/package/ServiceStack.OrmLite.SqlServer) – mythz