我正在使用EF5 Code First,我有名为XXXEntity
的实体,它基于Entity
类,Entity
类中有Id
属性。
这是问题,通常EF将为名为XXXEntities且具有Id字段的每个实体创建表。我想要的是该表应该命名为XXX
(没有实体),ID应该是XXXId
。如何通过使用约定立即执行此操作。我知道我可以覆盖表名,并且Id可以逐个命名。但它有点无聊而且不可重用,有没有更好的方法来使用惯例或EF 5上的东西?
更新
我读到custom code first conventions但不确定这是一个过时的页面还是未实现的功能。因为我无法在EF 5上找到Properties<T>()
方法
答案 0 :(得分:2)
不,你不能用EF 5做到这一点,你的链接是EF 6的未来功能see here
但是您可以轻松地使用反射来实现,为了可重用性,您可以将其作为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);
}
}
只需在OnModelCreating
方法
protected override void OnModelCreating(DbModelBuilder mb)
{
base.OnModelCreating(mb);
mb.ToMyDatabaseNamingConvention(GetEntities());
}
注意:
MyCustomNamingConvention
。 GetEntities()
是一种迭代你的实体的方法(记得跳过
Entity
基类)答案 1 :(得分:1)
使用此选项删除表格复数:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
我似乎无法找到您可以为列Id名称禁用的约定。看看http://msdn.microsoft.com/en-us/library/gg696316(v=vs.103).aspx