2013-03-01 48 views
3

我希望能夠設置EF Code First約定,其中屬性的所有列名都有小寫的第一個字母。EF Code First Fluent API - 所有列中的小寫第一個字母

但是,我有其他流利的API代碼,從默認更改列名稱。我似乎無法找到一種方法來訪問當前的列屬性的名稱,以便小寫第一個字母。如PropertyBuilder.Properties()中那樣,從PropertyInfo開始是不夠的,因爲列名可能已經被設置爲與成員名稱不同。

我如何一般地告訴EF代碼首字母小寫所有列名的第一個字母?

+0

你的電話,但只是好奇:爲什麼小寫字符這麼重要嗎?你可以節省很多麻煩。 – 2013-03-01 18:45:42

+0

@GertArnold它是那些討厭的DBA。 :-)我選擇與他們的戰鬥,並選擇不選擇這個如果我可以幫助它。 – RationalGeek 2013-03-01 20:28:06

+0

另外,如果您的Postgres作爲數據庫運行,它會強制使用全小寫的表格和列名稱,這很有價值 – 2016-03-27 00:13:37

回答

5

好的,數據庫管理員正在講話。讓我們尊敬地低頭,看看我們能做些什麼。我擔心在EF 5(或更低版本)中,你可以做的很簡單。在EF 6中,有Custom Code First Conventions這個功能實際上使它成爲一塊蛋糕。我只是想一個小樣本:

// Just some POCO 
class Person 
{ 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 
} 

// A custom convention. 
class FirstCharLowerCaseConvention : IStoreModelConvention<EdmProperty> 
{ 
    public void Apply(EdmProperty property, DbModel model) 
    { 
     property.Name = property.Name.Substring(0, 1).ToLower() 
         + property.Name.Substring(1); 
    } 
} 

class MyContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    modelBuilder.Entity<Person>(); 

    // Add the convention to the modelbuilder. 
    modelBuilder.Conventions.Add(new FirstCharLowerCaseConvention()); 

    base.OnModelCreating(modelBuilder); 
    } 
} 

運行

using (var db = new MyContext()) 
{ 
    db.Database.Create(); 
} 

我的數據庫中有一個PeoplepersonIdpersonName後。

和一些簡單的CRUD操作完美的工作:

using (var db = new MyContext()) 
{ 
    var p = new Person { PersonName = "Another Geek" }; 
    db.Set<Person>().Add(p); 
    db.SaveChanges(); 
} 

using (var db = new MyContext()) 
{ 
    var x = db.Set<Person>().ToList(); 
} 

所以,如果DBA的希望自己的約定,你可以要求一個新的玩具:)

+0

除了當我嘗試創建一個實體並添加它時,我似乎可以使用這一事實,我得到一個InvalidOpEx「實體類型協議不是當前上下文模型的一部分「。不確定問題是什麼...... – RationalGeek 2013-03-04 17:18:53

+0

啊,那是個壞消息。我已經研究過它,但目前還沒有任何線索。這就是這些alpha特徵的問題,幾乎沒有任何文檔。 – 2013-03-04 21:31:17

+0

Yeup。我一直在做同樣的事情。 – RationalGeek 2013-03-05 12:15:07