2013-03-01 29 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