实体框架 6 代码优先到 RDS 尝试创建数据库

Posted

技术标签:

【中文标题】实体框架 6 代码优先到 RDS 尝试创建数据库【英文标题】:Entity Framework 6 Code First to RDS trying to Create Database 【发布时间】:2017-05-09 19:39:37 【问题描述】:

我有一个现有的数据库以及一些我想使用实体框架 (v6.0.0.0) 推送到该数据库的现有代码。

我连接到数据库没有问题,我检查了上下文和迁移文件,对我来说一切都很好。

当我运行Update-Database -Verbose 命令时,我收到以下错误:

CREATE DATABASE permission denied in database 'master'.

我不清楚为什么它甚至试图创建一个数据库,b/c 已经存在,我在设置中指定了数据库。

这是我的 app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxx" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
          <parameter value="Server=[xxxxxxxxxx].rds.amazonaws.com,1433;Database=[xxxxxxxxxx];UID=[xxxxxxxxxx];PWD=[xxxxxxxxxx]" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="DataModel" connectionString="Server=[xxxxxxxxxx].rds.amazonaws.com,1433;Database=[xxxxxxxxxx];UID=[xxxxxxxxxx];PWD=[xxxxxxxxxx]"/>
  </connectionStrings>
</configuration>

有什么理由会忽略我的数据库名称并尝试从头开始创建一个新名称?

【问题讨论】:

你的登录是否有能力在连接到master时枚举数据库?见docs.microsoft.com/en-us/sql/relational-databases/databases/… 可能重复的问题:***.com/a/14532846/3424480 @DavidBrowne - 根据文章,我已经为用户添加了“查看任何数据库”权限,也按照文章的建议进行了测试和确认。问题依然存在。 @monkeyApple21 - 不要认为这是一个骗局,我特别想知道为什么它首先要尝试CREATE DATABASE。数据库已经存在。 【参考方案1】:

所以我想通了……

解决方案(至少在我的情况下)是我的 app.config 文件中有两个连接字符串。

我在&lt;connectionsStrings&gt; 部分有一个,在&lt;parameters&gt; 部分有另一个(见上文)。

有一次我什至在&lt;connectionStrings&gt; 中注释掉了一个,因为另一个看起来更像实体框架版本。

事实证明,我遵循了在其他几个答案中找到的关于在 DbContext 文件中设置空类并将其硬编码为 &lt;connectionStrings&gt; 部分中列出的名称的建议。

像这样:

public class YourContext : DbContext
    
        public YourContext() : base("name=DefaultConnection")
        

        

        public DbSet<aaaa> Aaaas  get; set; 
    

在我这样做之后,我得到了以下错误:

The connection string 'DataModel' in the application's configuration file does not contain the required providerName attribute."

所以,我将connectionStrings 更改为如下所示:

  <connectionStrings>
    <add name="DataModel" connectionString="Server=[xxxxxxxxxx].rds.amazonaws.com,1433;Database=[xxxxxxxxxx];UID=[xxxxxxxxxx];PWD=[xxxxxxxxxx]" providerName="System.Data.SqlClient" />
  </connectionStrings>

然后,我收到以下错误:

CREATE TABLE permission denied in database '[xxxxxxxxx]'.

所以我回到数据库并为有问题的数据库添加了db_ddladmin 数据库角色。

之后,我运行了Update-Database,它成功了!

当然,我回去删除了db__ddladmin权限和View any database服务器权限。

【讨论】:

以上是关于实体框架 6 代码优先到 RDS 尝试创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先现有数据库和新数据库维护

实体框架 6 - 数据库优先 - 缺少字符串长度属性

PHP中的代码优先实体框架模型

使用实体框架、代码优先和 CRUD 操作的存储库模式

在代码优先实体框架中手动编辑数据库

更新映射到视图的实体框架实体