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

11

我创建了一个新的类库(包)项目(在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,对吗?

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

4个回答

4

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


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


我们需要一个dnx命令行工具,它将EF6封装起来并将命令委托给它。这是因为DNX项目看不到init.ps1install.ps1,这些文件是需要的才能让Add-Migration正常工作(至少目前是这样,参见这里)。

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

这个解决方案不需要单独的.csproj,流程相同,只是Update-Database会变成dnx ef database update等命令。

使用说明和示例可以在这里:Migrator.EF6找到。

稍后,在RTM版本中,您也将能够在DNX项目中使用这些功能。这可能是Microsoft为什么没有制作支持EF6迁移的工具的原因。


你有没有类似于Add-Migration InitialCreate –IgnoreChanges的等效命令?我需要一个空的。 - Mihai Bratulescu
1
@MihaiBratulescu 使用新的v1.2.0版本,您可以执行dnx ef migrations add InitialCreate --ignore-changes - mrahhal

3

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

我认为,很可能是因为ASP.NET 5项目不会调用EF6包中添加迁移命令的安装和卸载PowerShell脚本。你最好的选择是尝试将EF6 NuGet包中的命令行工具(我相信它被称为migrate.exe,但不确定)集成到项目中。


到目前为止,最佳答案。看起来你是正确的。由于包、配置和文件夹结构已经改变,这些 PowerShell 脚本可能不兼容。Migrate.exe 是行不通的。看起来它只用于从迁移中对数据库进行更改。Enable-Migration 和 Add-Migration 纯粹在 PowerShell 中使用。老实说,我只需要一些独立的实用程序,但就我现在所做的事情而言,“DropCreateDatabaseAlways”初始化器运行良好。 - Gerald Davis
2
还有一个与命令和VS2015 RC总体存在的问题:https://github.com/aspnet/EntityFramework/issues/1950。如果您将EF6工作拆分到单独的程序集中并使用旧的csproj样式,则应该能够在DNX451应用程序中引用它并使命令正常工作(假设您使用链接中的解决方法)。 - NPNelson

2

我通过创建一个旧的 .csproj 项目来解决这个问题,使得 Enable-Migrations 命令可以正常工作。唯一的区别是,我没有单独复制文件,而是使用“按链接添加”选项将它们全部添加为引用。

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


-4

你在这里和那里的答案都是不正确的。Asp.Net 5支持EF6,我现在就在使用它。问题仅限于迁移支持,目前尚不支持通过包管理器(powershell)进行迁移。 - Gerald Davis
我在另一个问题中回答了:我看到了多个关于与 ASP.NET 5 的身份验证和 DI 机制不兼容的报告。我认为你可以自行决定是否使用它,但需承担风险。 - Luca Morelli
整个堆栈都是预发布版,因此全部使用风险自负。我认为有些混淆的地方在于 asp.net 5 != core clr 5.0。ASP.NET 5 可以使用 core clr 5.0 或完整框架 4.5.1 运行。当然,微软在命名方面非常糟糕,所以会让人感到困惑,但是 core clr 5 不支持 EF6。它缺少一些 EF6 使用的必需系统程序集。4.5.1 支持 EF6。ASP.NET 5 可以在任一平台上运行。因此,只要目标是 clr 4.5.1 而不是 core clr 5.0,就可以在同一个项目中同时拥有 EF6 和 ASP.NET 5。 - Gerald Davis
我不是因为这个是预发布版就说“自行承担风险”,而是因为已经做出了选择,要转向ef 7,并且它也适用于传统的.net应用程序。我说“自行承担风险”,是因为这不是一个受支持的方案,所以你可能会发现在任何dnx和/或asp.net 5软件包更新后,你的应用程序停止运行。 - Luca Morelli
1
这里有一个链接,描述了ASPNET5如何支持在dnx451上运行EF6。https://msdn.microsoft.com/en-us/magazine/dn973011.aspx。如果你想要针对DNXCore50进行开发,那么你必须使用EF7。尽管我很想将我的应用程序转换为CoreCLR,但我发现EF7目前对于我的大多数用途来说还太粗糙了。我正在重构我的许多库以支持CoreCLR,但目前,任何依赖于EF的库都将保留在EF6上,这意味着它无法针对CoreCLR进行开发。一旦我对EF7感到满意,切换到CoreCLR就会变得容易。 - NPNelson
@NPNelson 这篇文章涵盖了所有内容,除了迁移。EF6中的迁移依赖于PowerShell,而在xproj项目中该集成似乎已经损坏。 - Gerald Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接