entity-framework - 如何使用不同的连接字符串(但相同的数据库)进行迁移

标签 entity-framework

我一直在使用这样的连接字符串将我的网站连接到我的数据库:

<add name="MyDb" 
     connectionString="Data Source=MyDb;
     Initial Catalog=Staging;
     User Id=website_staging;
     Password=secret;" 
     providerName="System.Data.SqlClient" />

website_staging 用户是 db_ddladmin 角色的成员,因此当我发布并且我的 MigrateDatabaseToLatestVersion 初始化程序运行时,它具有权限需要将数据库自动迁移到最新版本。

我想减少标准用户的权限(通过仅将其添加到 db_datareaderdb_datawriter 角色)并与不同的用户连接(在 db_ddladmin 中) 角色)在迁移过程中。

所以我添加了另一个具有不同名称和用户的连接字符串:

<add name="Migrations" 
     connectionString="Data Source=MyDb;
     Initial Catalog=Staging;
     User Id=website_staging_migrations;
     Password=secret;" 
     providerName="System.Data.SqlClient" />

并且我更改了在我的 DatabaseMigrationConfig 类中初始化的上下文所使用的连接字符串的名称:

public class DatabaseMigrationConfig
{
    internal static void Register()
    {
        using (var context = new MyDbContext(Name="Migrations"))
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, 
                                    Migrations.Configuration>());
            context.Database.Initialize(false);
        }
    }
}

在我的 Migrations.Configuration 类的构造函数中,我还更改了连接字符串:

internal sealed class Configuration : DbMigrationsConfiguration<SID2013Context>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = false;
        string cs = ConfigurationManager.ConnectionStrings["Migrations"].ConnectionString;
        TargetDatabase = new DbConnectionInfo(cs, "System.Data.SqlClient");
    }
}

然后我尝试发布该网站。它似乎正确选择了具有较高权限的连接字符串,但它尝试运行初始迁移。我怎样才能阻止它这样做?

最佳答案

我最终通过将 website_staging_migrations 用户添加到 db_datareaderdb_datawriter 角色以及 db_ddladmin 解决了这个问题> 角色。

用户显然需要读取__MigrationHistory表中的数据。让我困惑的是 EF 不会将访问表失败报告为错误,而是在尝试运行初始迁移时收到此错误:

There is already an object named '----' in the database.

并且用户还需要写入__MigrationHistory表。在将用户添加到 db_datawriter 角色之前,我收到此错误:

The INSERT permission was denied on the object '__MigrationHistory',
database 'Staging', schema 'dbo'.

关于entity-framework - 如何使用不同的连接字符串(但相同的数据库)进行迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342172/

相关文章:

c# - {"error":"Explicit construction of entity type ' ## #' in query is not allowed."}

c# - EntityType 'MvcHtmlString' 没有定义键 - MVC 4

c# - 如何使 Entity Framework 异步执行

c# - Entity Framework Core - Take(1)、Single()、First()... 不使用 Oracle 提供程序 (ORA-00933 : SQL command not properly ended)

c# - 映射到已存在的数据库列

c# - Override get, set 在 Entity Framework Database First

c# - 如何在不枚举查询的情况下将 string 转换为 int

entity-framework - Entity Framework 6.1 将我的数据库放在哪里?

entity-framework - Entity Framework CTP5 违反 PRIMARY KEY 约束

c# - 删除连接表,如何插入一行而不在数据库中查询该行引用的实体?