使用Azure DevOps进行部署时,有多个DbContext,但只有一个正在运行

时间:2019-07-12 10:04:16

标签: c# sql-server entity-framework azure-devops

我有一个具有多个DbContext(每个都有一个单独的架构)的API,它们都存在于同一数据库中且具有相同的连接字符串。一个API具有默认的“ dbo”,另一个是“ template”。部署时,仅创建dbo表,不创建模板架构表。我注意到,虽然数据库的“安全性”->“模式”部分中不存在模式“模板”。

Azure DevOps没有错误,也没有日志显示任何内容。

我可以在本地正常运行update-database -ConfigurationTypeName Configurationupdate-database -ConfigurationTypeName TemplateConfig

常规配置的上下文是:

namespace Acme.DAL.Contexts
{
    public class TemplateDbContext : BaseDbContext
    {
        public virtual DbSet<Template> Templates { get; set; }

        public TemplateDbContext() : base(ConnectionString)
        {
            SchemaName = "template";
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<TemplateDbContext, TemplateConfig>());
        }
        public TemplateDbContext(string connString) : base(connString)
        {
            SchemaName = "template";
        }
    }
}

BaseDbContext只是

namespace Acme.DAL.Contexts
{
    public abstract class BaseDbContext : DbContext
    {
        protected const string ConnectionString = "AcmeContext";
        protected string SchemaName;

        protected BaseDbContext() : base(ConnectionString) {}

        protected BaseDbContext(string connString) : base(connString) {}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            if (SchemaName != null)
            {
                modelBuilder.HasDefaultSchema(SchemaName);
            }
            base.OnModelCreating(modelBuilder);
        }
    }
}

配置文件为:

模板(无效)

namespace Acme.DAL.Migrations.Templates
{
    public class TemplateConfig : DbMigrationsConfiguration<TemplateDbContext>
    {
        public TemplateConfig()
        {
            AutomaticMigrationsEnabled = false;
            CommandTimeout = 300;
            MigrationsDirectory = @"Migrations\Templates";
        }
        protected override void Seed(TemplateDbContext context)
        {
            context.TemplateWorkshops.AddOrUpdate(x => x.Name, SeedTemplates.GetTemplates().ToArray());
            base.Seed(context);
        }
    }
}

dbo迁移

namespace Acme.DAL.Migrations
{
    public sealed class Configuration : DbMigrationsConfiguration<Contexts.ApplicationDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            AutomaticMigrationDataLossAllowed = false;

            CommandTimeout = 300;
        }

        protected override void Seed(Contexts.ApplicationDbContext context)
        {
            context.Clients.AddOrUpdate(x => x.Name, SeedClients.GetDefaultClients().ToArray());

            base.Seed(context);
        }
    }
}

如有其他需要,请喊。

我检查了连接字符串在到达发布的Web API时是否已被更改,但是没有,这仍然是正确的。

我希望这会在本地运行update-database的情况下起作用。

1 个答案:

答案 0 :(得分:0)

问题在于,在我访问网站的一部分之前,发生了一些问题,这将导致为TemplateDbContext调用setInitializer方法。因此,没有构造表格(根据Flex的注释(因为注释是注释,所以不知道如何标记您的名字))。

上面的代码本身是可以的。