EF Code First Fluent API - 所有列的小写首字母

时间:2013-03-01 14:34:54

标签: entity-framework ef-code-first

我希望设置一个EF Code First约定,其中属性的所有列名都有一个小写的第一个字母。

但是,我有其他更流畅的API代码,可以更改默认的列名。我似乎无法找到一种方法来访问属性的当前列名称,以便小写第一个字母。从PropertyInfo开始,就像在modelBuilder.Properties()中一样,因为列名可能已经设置为与成员名不同。

我如何通常告诉EF Code First小写所有列名的第一个字母?

1 个答案:

答案 0 :(得分:5)

好的,DBA正在发言。让我们低头敬畏,看看我们能做些什么。我担心在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想要他们的约定,你可以要求一个新的玩具:)