为DbContext设置模式名称

37

我知道如何在我的上下文中设置表的模式,但是否有一种方法可以为上下文中的所有表设置默认模式?

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

    public DbSet<Student> Students { get; set; }
}
2个回答

63

你可以在自定义继承的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");
            }
        }

从EF6开始,您可以使用DbModelBuilder上的HasDefaultSchema方法指定用于所有表、存储过程等的数据库模式。这个默认设置将被覆盖,任何您明确为不同架构配置的对象都将被覆盖。


2
当我尝试设置“HasDefaultSchema”时,出现了错误 - 与创建数据库时不同的上下文模型。请考虑使用Code First迁移来更新数据库。你知道如何解决这个问题或者造成这个问题的原因吗? - superachu
@AchuthaKrishnan 要解决这个问题,您需要更新您的迁移。这是一个不错的教程:http://www.learnentityframeworkcore.com/migrations。在命令提示符中运行以下命令:dotnet ef database update - Fabio
这个即使在EF6中也不起作用。每当我实例化上下文时,OnModelCreating函数都没有被调用,有什么想法吗? - AhammadaliPK
仍然在使用默认的公共架构。 - Morgeth888
1
哦,好的,这里有一个重要细节,你的迁移不会重新运行,它们在创建时默认模式很重要。 - Morgeth888

13
根据微软官方文档,您应该使用数据注释(Data Annotations)或FluentAPI。
1. 对于数据注释:
[Table("blogs", Schema = "blogging")]
public class Blog
{

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

或者使用流畅的API在模型级别定义默认架构:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
    modelBuilder.HasDefaultSchema("blogging");
}

Microsoft 文档


问题是如何设置默认架构。这个问题已经在被接受的答案中得到了回答。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接