我希望设置一个EF Code First约定,其中属性的所有列名都有一个小写的第一个字母。
但是,我有其他更流畅的API代码,可以更改默认的列名。我似乎无法找到一种方法来访问属性的当前列名称,以便小写第一个字母。从PropertyInfo开始,就像在modelBuilder.Properties()中一样,因为列名可能已经设置为与成员名不同。
我如何通常告诉EF Code First小写所有列名的第一个字母?
答案 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();
}
我的数据库有People
表personId
和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想要他们的约定,你可以要求一个新的玩具:)