如何在 asp.net 5 项目中启用迁移(EF6)?

Posted

技术标签:

【中文标题】如何在 asp.net 5 项目中启用迁移(EF6)?【英文标题】:How to enable migrations (EF6) in an asp.net 5 project? 【发布时间】:2015-07-25 01:31:32 【问题描述】:

我创建了一个新的类库(包)项目(在 VS 2015 RC 之前,使用了更糟糕的 asp.net 类库名称来表示数据层。为了明确这是较新的 kproj 样式结构。

将 EF 6.1.3 添加到 project.json。目前仅针对 DNX451。

   "dependencies": 
        "EntityFramework": "6.1.3"
        ,"Moq": "4.2.1502.911"
    ,

创建初始模型类并使用 AlwaysCreate 数据库初始化程序一切正常。现在需要切换到迁移,所以在包管理器控制台中使用 Enable-Migrations 并得到:

Enable-Migrations : The term 'Enable-Migrations' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Enable-Migrations
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Enable-Migrations:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

对于 EF7 迁移,迁移命令不支持包管理器。相反,有一个新的 ef 命令通过 dnu 运行,但该新进程仅适用于 EF7 而不是 EF6,对吗?

为什么包管理器认为 Enable-Migrations 无效,即使引用了 EF6?

【问题讨论】:

【参考方案1】:

编辑 1.0.0: Migrator.EF6 现在支持 1.0.0。


编辑 RC2: Migrator.EF6 现在支持 RC2。


我们需要的是一个 dnx 命令行工具,它封装了 EF6 并将命令委托给它。这是因为 DNX 项目不会看到使Add-Migration 工作所需的init.ps1install.ps1(至少现在,请参阅this)。

实现并不难,但似乎没有人给它时间,所以我最终做了一个。

此解决方案不需要单独的.csproj,会发生相同的工作流程,但您将使用dnx ef database update 和类似的命令代替Update-Database

说明和示例可以在here: Migrator.EF6找到。

稍后,可能在 RTM 中,您也可以在 DNX 项目中使用这些。这可能就是为什么微软没有做出支持 EF6 迁移的工具。

【讨论】:

你有相当于 Add-Migration InitialCreate –IgnoreChanges 的吗?我需要一个空的 @MihaiBratulescu 使用新的v1.2.0,你可以做dnx ef migrations add InitialCreate --ignore-changes【参考方案2】:

为什么包管理器认为 Enable-Migrations 无效,即使引用了 EF6?

因为我假设并且非常确定 ASP.NET 5 项目不会在 EF 6 包必须将迁移命令添加到包管理器控制台的包中调用安装和卸载 PowerShell 脚本。你最好的运气是尝试将命令行工具(我相信它称为 migrate.exe,不确定)集成到 EF6 NuGet 包中。

【讨论】:

迄今为止的最佳答案。看起来你是对的。随着包、配置和文件夹结构的更改,这些 ps 脚本可能不兼容。 Migrate.exe 是一条死胡同。看起来它仅用于从迁移中更改数据库。 Enable-Migration 和 Add-Migration 完全在 powershell 中。老实说,我只需要一些独立的实用程序,但对于我现在所做的,“DropCreateDatabaseAlways”初始化程序工作正常。 命令和 VS2015 RC 通常也存在问题:github.com/aspnet/EntityFramework/issues/1950。如果您将 EF6 工作拆分为单独的程序集并使用旧的 csproj 样式,您应该能够在 DNX451 应用程序中引用它并让命令工作(假设您使用链接中的解决方法)【参考方案3】:

我已经设法通过创建一个旧的 .csproj 项目来解决这个问题,该项目可以使用 Enable-Migrations 命令。唯一的区别是,我没有单独的文件副本,而是通过引用添加了它们,在添加现有文件时使用“通过链接添加”选项。

现在我可以添加迁移等并根据需要更改文件,这些更改将自动反映在我的 .xproj 中,因为它是相同的文件。

【讨论】:

【参考方案4】:

在 asp.net 5 项目中,您必须使用实体框架 7 并从命令行使用 ef 迁移命令。

我刚刚在这里做了一个回顾How can I manage EF 6 migrations in visual studio 2015?

【讨论】:

您在此处和此处的答案都不正确。 Asp.Net 5 支持 EF6。我现在可以正常工作。该问题仅限于支持当前不通过包管理器 (powershell) 支持的迁移。 我在另一个问题中回答:我看到很多关于与 asp.net 5 中的身份和 di 机制不兼容的报告。我认为您可以自担风险使用它, 好吧,整个堆栈都是预发布的,因此使用风险自负。我认为有些困惑是 asp.net 5 != core clr 5.0。 ASP.NET 5 可以使用核心 clr 5.0 或完整框架 4.5.1 运行。当然,微软在命名事物方面很糟糕,所以它会让人感到困惑,但核心 clr 5 不支持 EF6。它缺少 EF6 使用的一些必需的系统程序集。 4.5.1 确实支持 EF6。 ASP.NET 5 可以在其中任何一个上运行。因此,只要 EF6 和 ASP.NET 5 仅针对 clr 4.5.1,它就可以在同一个项目中使用。不是核心 clr 5.0。 我并不是说使用风险自负,因为它是预发布版本,而是因为已经选择迁移到 ef 7,并且它也可用于传统的 .net 应用程序。我说使用风险自负,因为它不是受支持的场景,所以你可以说你的应用程序在更新 dnx 和/或 asp.net 5 包后停止运行 这里是描述 ASPNET5 如何支持在 dnx451 上运行 EF6 的链接。 msdn.microsoft.com/en-us/magazine/dn973011.aspx。如果你想定位 DNXCore50,那么你必须使用 EF7。尽管我想将我的应用程序转换为 CoreCLR,但我发现 EF7 现在对于我的大部分用途来说都过于粗糙了。我正在重构我的很多库以支持 CoreCLR,但目前,任何依赖 EF 的库都将保留在 EF6,这意味着它不能以 CoreCLR 为目标。一旦我对 EF7 感到满意,应该可以轻松切换到 CoreCLR

以上是关于如何在 asp.net 5 项目中启用迁移(EF6)?的主要内容,如果未能解决你的问题,请参考以下文章

带有 dnx 项目的 EF 6

如何在我的 ASP.NET 核心 WebApi 项目中全局启用 CORS

如何使用 MVC3 ASP.NET 4.5 和 EF6 基于实体属性注释对 TextBoxFor 进行舍入

如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x

如何仅保存/更新父实体而不将其子实体保存在 asp.net mvc 的 EF6 中?

如何从实体框架 4 升级到 EF6?