不,您不能使用 EF 5 做到这一点,您的链接是 EF 6 的未来功能,请参见此处
但是您可以通过反射轻松地做到这一点,为了可重用性,您可以将其作为 的扩展方法DbModelBuilder
,有点慢,但它解决了您的问题。在这里你可以做什么:
public static class MyCustomNamingConvention
{
public static void ToMyDatabaseNamingConvention(
this DbModelBuilder mb, IEnumerable<Type> entities)
{
foreach (var entity in entities)
{
var mi = typeof(MyCustomNamingConvention)
.GetMethod("MyNamingConvention")
.MakeGenericMethod(entity);
mi.Invoke(null, new object[] { mb });
}
}
public static void MyNamingConvention<T>
(DbModelBuilder mb) where T : Entity
{
var tableName = typeof(T).Name.Replace("Entity", "");
mb.Entity<T>().HasKey(x => x.Id);
mb.Entity<T>().Property(x => x.Id).HasColumnName(tableName + "Id");
mb.Entity<T>().ToTable(tableName);
}
}
只需在您的 DBContext onOnModelCreating
方法上使用它
protected override void OnModelCreating(DbModelBuilder mb)
{
base.OnModelCreating(mb);
mb.ToMyDatabaseNamingConvention(GetEntities());
}
笔记:
- 记得添加适当的命名空间
MyCustomNamingConvention
。
GetEntities()
是一种迭代实体的方法(记得跳过Entity
基类)