3

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

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

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

4

1 回答 1

5

好的,DBA 正在发言。让我们恭敬地低下头,看看我们能做些什么。恐怕在 EF 5(及更低版本)中,您可以做的事情并不多。在 EF 6 中,自定义代码优先约定的这一特性实际上使它变得轻而易举。我只是尝试了一个小样本:

// 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();
}

我的数据库有一个People带有personIdand的表personName

一些简单的 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 想要他们的约定,您可以要求一个新玩具 :)

于 2013-03-01T21:09:16.097 回答