1

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

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

更新

我阅读了有关自定义代码优先约定的信息,但不确定这是一个过时的页面还是未实现的功能。Properties<T>()因为我在 EF 5 上找不到方法

4

2 回答 2

2

不,您不能使用 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基类)
于 2012-12-13T01:23:40.673 回答
1

使用它来删除表格复数:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

我似乎找不到可以为列 ID 名称禁用的约定。看看http://msdn.microsoft.com/en-us/library/gg696316(v=vs.103).aspx

于 2012-12-12T07:10:44.853 回答