有没有人知道是否可以根据类的命名空间设置代码的表模式第一类?
例如,名称空间Core.Foo
中的每个类都具有Foo
的模式。
答案 0 :(得分:26)
好吧,您可以使用以下两个选项之一指定架构名称:
[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
}