设置DbContext的模式名称

Joh*_*n S 15 c# entity-framework database-schema entity-framework-6

我知道如何在我的上下文中为表设置模式,但有没有办法为上下文中的所有表设置默认模式?即

[Schema = "Ordering"] 
public class MyContext:DbContext
{
    public MyContext()
        : base("name=ConnectionString")
    {
    }

    public DbSet<Student> Students { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Dfr*_*Dkn 23

您可以在自定义继承的DbContext类的OnModelCreating方法中配置默认​​架构,如 -

public class MyContext: DbContext 
        {
            public MyContext(): base("MyContext") 
            {
            }

            public DbSet<Student> Students { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //Configure default schema
                modelBuilder.HasDefaultSchema("Ordering");
            }
        }
Run Code Online (Sandbox Code Playgroud)

从EF6开始,您可以使用DbModelBuilder上的HasDefaultSchema方法指定用于所有表,存储过程等的数据库模式.对于您为其显式配置不同模式的任何对象,将覆盖此默认设置.

  • 当我尝试设置"HasDefaultSchema"时,我收到此错误 - 自创建数据库以来,支持''上下文的模型已更改.考虑使用Code First Migrations来更新数据库.你知道怎么解决它或者是什么原因? (2认同)

小智 15

根据微软官方文档,您应该使用数据注释或 FluentAPI。

  1. 对于数据注释:
[Table("blogs", Schema = "blogging")]
public class Blog
{

    public int BlogId { get; set; }
    public string Url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 对于 FluentAPI
protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
    modelBuilder.Entity<Blog>()
        .ToTable("blogs", schema: "blogging");
}
Run Code Online (Sandbox Code Playgroud)

或者使用 Fluent API 在模型级别定义默认模式:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
    modelBuilder.HasDefaultSchema("blogging");
}
Run Code Online (Sandbox Code Playgroud)

微软文档