使用 Entity Framework Migrations 4.3 时如何显式命名数据库

Posted

技术标签:

【中文标题】使用 Entity Framework Migrations 4.3 时如何显式命名数据库【英文标题】:How to explicitly name the database when using Entity Framework Migrations 4.3 【发布时间】:2012-03-08 19:16:34 【问题描述】:

我最近开始使用 Entity Framework 迁移,并注意到当我运行 Update-Database 命令时,数据库名称并没有为我所用。

我的连接字符串是:

<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

我第一次运行 Update-Database 我的数据库是用正确的名称 TestDB 创建的。但是,一旦我对我的一个实体进行了更改,除非我添加启动项目名称(我正在使用多项目解决方案),否则它将不再为我更新:

Update-Database -StartUpProjectName "TestDB.Data"

这会创建另一个新的数据库,迁移将始终继续使用该数据库。我不介意必须输入 StartUpProjectName 命令,但有没有办法覆盖此生成的数据库的默认名称?它总是将数据库创建为

TestDB.Data.DataContext

有没有办法确保在传递 StartUpProject 名称时创建的数据库只是称为 TestDB 还是使用 StartUpProjectName 设置的限制?

作为说明,我认为我需要指定 StartUpProjectName 的原因是我有一个多层项目设置。迁移配置文件在我的“数据”项目中,实体/模型在我的“域”项目中,等等。我的 Global.asax.cs 文件中目前也没有任何初始化选项,就像我之前使用的那样代码优先 ef 4.2。因此,在我的项目中,我的数据项目中只有一个 DataContext,该项目中也有迁移配置。

编辑:

自从我最初设置这个问题以来,我偶然发现了在多项目解决方案中命名数据库的“正确”方法。虽然下面的答案会起作用,但这确实意味着您正在将 web.config 复制到另一个不是理想解决方案的区域。相反,您可以通过执行以下操作将名称放入您的 DbContext 中(DataContext 只是我在项目中使用的名称):

public class DataContext : DbContext

    public DataContext() : base("DatabaseNameHere")
     

    public DbSet<Table1> Table1  get; set; 
    public DbSet<Table2> Table2  get; set; 

    public virtual void Commit()
    
        base.SaveChanges();
    

谢谢,

丰富

【问题讨论】:

感谢您编辑的答案..帮助了我很多.. 另外,我发现这篇文章很有帮助。 msdn.microsoft.com/en-us/data/jj592674.aspx 【参考方案1】:

您可以通过将其作为参数提供来避免在 app.config 中对其进行管理:

Update-Database -Verbose 
 -ConnectionString "CONNECTIONSTRING" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT

Easy-piezy,如果你喜欢无休止地打字的话。

【讨论】:

找不到“System.Data.SqlClient”怎么办? 有什么方法可以在启动项目的 web.config 上定义?我希望我的构建服务器自动将迁移更改推送到我的数据库,但不允许我这样做 如果您尝试从 Web.config 中提取连接字符串,您应该使用 -ConnectionStringName "DefaultConnection" 您可以在此处获取所有命令行选项的列表:coding.abel.nu/2012/03/ef-migrations-command-reference/… 在 2020 年,这个参数列表不再起作用 :(【参考方案2】:

在执行update-database 时,您应该指定包含迁移的项目。确保您在该项目中有一个包含正确连接字符串的app.config 文件。

将应用程序拆分为多个项目时,运行应用程序时使用的连接字符串是启动的项目之一。迁移时,使用的连接字符串是包含迁移的项目之一。

当我进行类似的设置时,我必须在两个地方添加连接字符串。有点尴尬,但确实有效。

【讨论】:

刚刚测试了它,它工作!感谢您的建议 - 永远不会想到将连接字符串放在另一个项目中!再次感谢:) 我将我的连接字符串放在一个单独的连接字符串文件中,该文件在 web 项目中被引用。然后,我从我的其他项目链接到该连接字符串文件,这避免了跨项目重复连接字符串。 包管理器控制台似乎忽略了 Visual Studio 中的当前构建配置。这是预期的行为吗?我对选择正确的连接字符串非常感兴趣,但项目本身可能存在其他差异。包管理器控制台如何决定选择什么 exe/dll?【参考方案3】:

您可以将连接字符串存储在网站项目的 web.config 中,并将 DBContext 和迁移文件存储在另一个项目中,并且仍然共享相同的连接字符串。但是,除了将 Data 项目(或其中包含 DBContext 等的任何项目)设置为 Package Manager Console 的默认项目外,您还需要确保 还需要确保您的网站已设置到默认启动项目!!!

我无法在任何地方看到这一点,但是疯狂的 24 小时无法弄清楚为什么我的迁移突然被应用到 SQLExpress 数据库,这让我得出了这个结论。

【讨论】:

两年后的 +1,因为上面的粗体部分正是我经过自己疯狂的 24 小时搜索后所需要的! 谢谢!连接字符串是从启动项目的 app.config/web.config 中读取的。 在 EF 迁移命令中设置默认启动项目或设置 -StartUpProjectName 属性。 这很荒谬,但我也遇到了这个问题。绝对不会猜到!当然,我可以指定为命令行开关,但对于我的一生,我无法弄清楚为什么我过去从来没有这样做过。我想我一直很幸运。 :)【参考方案4】:

我尝试使用 Nuget 的最新 EF5。

但是,Update-Database 不会从包含迁移的项目中读取 App.config(就像 1 年前的答案一样),但它只会从 启动项目 中读取 *.config。这很棒,但我发现 Add-MigrationUpdate-Database 如何在这里找到合适的连接字符串:

    它首先尝试获取“DefaultConnection”连接字符串 然后它试图根据上下文类名称获取连接字符串名称。例如。我有从DbContext 派生的MyContext 类,所以我可以使用“MyContext”连接字符串名称。当我有多个数据库连接时很有用。 如果没有找到上述两个连接字符串名称,它将失败并且不显示“DefaultConnection”连接字符串,除非您提供-ConnectionStringName 参数。请参阅 get-help Update-Database 以查看包管理器控制台中的帮助页面。

没有重试或回退尝试,因此如果“DefaultConnection”包含错误的连接字符串,它只会显示错误。

如果连接字符串中同时存在 DefaultConnection 和上下文名称,则 DefaultConnection 将优先。

我希望 #2 成为第一次尝试,因为名称更具体,但上述步骤是 EF5 迁移在尝试连接到数据库时所做的。

【讨论】:

我遇到了同样的问题,发现与此海报类似,迁移在启动项目中使用连接字符串,并且连接字符串的名称与上下文相同. 这真的很奇怪。它总是从启动项目配置文件中读取 connectionString。如果找不到,则使用 DbContext 名称创建数据库。

以上是关于使用 Entity Framework Migrations 4.3 时如何显式命名数据库的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 学习系列 - 认识理解Entity Framework

csharp 使用Entity Framework和OracleParameters执行查询

转:Entity Framework 5.0 Code First全面学习

Entity Framework Code First

Entity Framework 5.0 Code First全面学习

为啥 Entity framework Entity Master Details Entity Edit