如何一次配置表名和ID

时间:2012-12-12 06:56:27

标签: c# .net entity-framework ef-code-first entity-framework-5

我正在使用EF5 Code First,我有名为XXXEntity的实体,它基于Entity类,Entity类中有Id属性。

这是问题,通常EF将为名为XXXEntities且具有Id字段的每个实体创建表。我想要的是该表应该命名为XXX(没有实体),ID应该是XXXId。如何通过使用约定立即执行此操作。我知道我可以覆盖表名,并且Id可以逐个命名。但它有点无聊而且不可重用,有没有更好的方法来使用惯例或EF 5上的东西?

更新

我读到custom code first conventions但不确定这是一个过时的页面还是未实现的功能。因为我无法在EF 5上找到Properties<T>()方法

2 个答案:

答案 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方法

上的DBContext上使用它
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