我希望建立一个 EF Code First 约定,其中属性的所有列名都有一个小写的第一个字母。
但是,我有其他流畅的 API 代码可以更改默认的列名。我似乎找不到一种方法来访问属性的当前列名以小写第一个字母。从 PropertyInfo 开始,如在 modelBuilder.Properties() 中是不够的,因为列名可能已经设置为与成员名不同。
我一般如何告诉 EF Code First 将所有列名的第一个字母小写?
我希望建立一个 EF Code First 约定,其中属性的所有列名都有一个小写的第一个字母。
但是,我有其他流畅的 API 代码可以更改默认的列名。我似乎找不到一种方法来访问属性的当前列名以小写第一个字母。从 PropertyInfo 开始,如在 modelBuilder.Properties() 中是不够的,因为列名可能已经设置为与成员名不同。
我一般如何告诉 EF Code First 将所有列名的第一个字母小写?
好的,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
带有personId
and的表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 想要他们的约定,您可以要求一个新玩具 :)