实体框架6 - 代码优先:来自类的表格模式'命名空间

时间:2015-03-18 18:04:41

标签: entity-framework

有没有人知道是否可以根据类的命名空间设置代码的表模式第一类?

例如,名称空间Core.Foo中的每个类都具有Foo的模式。

3 个答案:

答案 0 :(得分:26)

好吧,您可以使用以下两个选项之一指定架构名称:

  • 使用Data Annotations

    [Table("TableName","Foo")]
    public class Entity
    {
    }
    
  • 使用Fluent Api

    modelBuilder.Entity<Entity>().ToTable("TableName", "Foo");
    

更新

在这个主题中挖掘更多内容,我认为你所寻找的是EF的Custom Convention

public class CustomSchemaConvention : Convention
{
    public CustomSchemaConvention()
    {
        Types().Configure(c => c.ToTable(c.ClrType.Name, c.ClrType.Namespace.Substring(c.ClrType.Namespace.LastIndexOf('.') + 1)));
    }
}

然后,在您的上下文中,您需要覆盖OnModelCreating方法以添加新约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Conventions.Add(new CustomSchemaConvention());
}

答案 1 :(得分:5)

我将为octavioccl提供的内容添加一个内容。如果您想保留表名复数,可以使用如下内置复数服务:

using System.Data.Entity.Infrastructure.DependencyResolution;
public class CustomSchemaConvention : Convention
{
    public CustomSchemaConvention()
    {
        var pluralizationService = DbConfiguration.DependencyResolver.GetService<IPluralizationService>();
        Types().Configure(c => c.ToTable(
            pluralizationService.Pluralize(c.ClrType.Name),
            c.ClrType.Namespace.Substring(c.ClrType.Namespace.LastIndexOf('.') + 1))
        );
    }
}

答案 2 :(得分:3)

在EF 6.2或EF Core中,使用Schema属性为Db表指定架构名称,如下所示:

[Table("TableName", Schema = "Foo")]
public class Entity
{
    //Properties
}

Details Here