【问题标题】:.NET Core Entity Framework - Add migration for Context in class library.NET Core Entity Framework - 在类库中添加 Context 迁移
【发布时间】:2017-02-13 21:08:09
【问题描述】:

我在将初始迁移添加到 .NET Core 类库中的 Entity Framework 数据库上下文时遇到问题。

当我跑步时:

dotnet ef migrations add migrationName -c PlaceholderContext

我得到错误:

Could not invoke this command on the startup project 'Placeholder.Data'. This version of the Entity Framework Core .NET Command Line Tools does not support commands on class library projects in ASP.NET Core and .NET Core applications. See http://go.microsoft.com/fwlink/?LinkId=798221 for details and workarounds.

所以我点击了link 并了解到无法将迁移添加到类库。但是,您可以将类库项目转换为“应用程序”项目,但这样做我无法从我的业务层(类库)引用这个“应用程序”项目。

项目结构:

Placeholder.Web (WebAPI) => Placeholder.Business(类库)=> Placeholder.Data(类库)

Placeholder.Web => Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddMvc();

        //HERE WE REGISTER DB CONTEXT, (STATIC CLASS IN BUSINESS LAYER)
        services.InjectBusinessContext(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=Placeholder;Integrated Security=True;Connect Timeout=30;");

        services.InjectWebServices();
        services.InjectBusinessServices();
    }

我该如何克服这个非常烦人的问题?

更新(1)

我已将我的 Placeholder.Data 类库转换为具有静态 main 方法的“应用程序”。因为我不能再从 Placeholder.Business 引用 Placeholder.Data,所以我必须使用 microsoft doc 页面上列出的解决方法 2。当我现在运行迁移脚本时,我得到以下信息:

没有为此 DbContext 配置数据库提供程序。一种 可以通过覆盖 DbContext.OnConfiguring 来配置提供程序 方法或通过在应用程序服务提供者上使用 AddDbContext。 如果使用了 AddDbContext,那么还要确保你的 DbContext 类型 接受一个 DbContextOptions 对象在其构造函数中,并将其传递给 DbContext 的基本构造函数

这当然行不通,dbcontext 是从我的 Placeholder.Web 应用程序注册的(通过业务层)。然后我唯一的选择是在新的静态 main 方法中添加一个新的上下文,我真的不想这样做..

【问题讨论】:

    标签: c# .net entity-framework asp.net-core .net-core


    【解决方案1】:

    您无需将数据项目“转换”为应用程序。这是一个具有类似结构的测试应用程序:

    在Data项目的project.json中,添加asp.net core nuget包。

    现在,要创建迁移,只需右键单击 Data 项目,选择“在文件资源管理器中打开文件夹”,然后在文件资源管理器中,按 Shift + 右键单击​​并“在此处打开命令窗口”。

    要创建迁移,只需将“启动项目”指定为 Web 应用(startup.cs 所在的位置)

    dotnet ef --startup-project ../TestPatterns2.Web migrations add Second
    

    瞧,迁移:

    将迁移文件夹添加到数据项目中: 定义服务时,像这样添加迁移点

    services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("TestPatterns2.Data")));
    

    【讨论】:

    • 我回家后试试这个!
    • 如果对您有用,请标记为答案。如果您想更进一步,您还可以在您的 DATA 类库项目中扩展 IServiceCollection,并在其中添加 DI 和连接字符串,这样您的 Web 项目将完全独立于 DATA 项目。
    • 抱歉回复晚了,刚刚试过你的代码,它可以工作,干杯。但!如果您查看我的项目结构,我有一个名为迁移的自行创建的文件夹。当我运行命令时,我的根目录中有一个新的迁移文件夹? 1. 我可以改变这个吗? 2. 如果我想在第一次初始迁移后添加更多迁移,我需要再次执行这些步骤还是可以使用包管理器控制台以正常方式创建它?
    • 1) 是的,您可以,更新答案以显示如何执行此操作 2) 如果您想添加更多迁移,只需通过命令行运行 dotnet ef 命令并指定新的迁移名称.您不能通过 ASP.NET Core 中的包管理器控制台运行迁移 - 它必须通过 CLI
    • 抱歉唠叨。 MigrationsAssembly 参数似乎有问题。我得到:您的目标项目“Placeholder.Data”与您的迁移程序集“Placeholder.Data/Database/Migrations”不匹配,(我将 MigrationsAssembly 更改为“Placeholder.Data/Database/Migrations”。如果我只使用占位符。数据有效)
    【解决方案2】:

    它只需要一个用于进行迁移的应用程序(需要一个入口点),因此在将库设置为应用程序并创建迁移后,注释掉 project.json 中的 buildOptionsruntimes 元素。现在它将再次构建为库。

    当您需要添加另一个迁移时,取消注释它们。

    【讨论】:

    • 我尝试从“netstandard1.6”转换为“netcoreapp1.0”,但我得到.Data is not compatible with netstandard1.6。
    • 好的,我必须卸载业务层,(参考)然后它工作了。我将类库转换为应用程序。因为我无法从 .Business 中引用 .Data,所以我不得不使用解决方法 2。似乎我需要使用 .Data 中的 main 方法注册上下文?我不想这样做..
    • @Reft 我使用的解决方案是为它声明一个 DBFactory。不过,我不记得我发现的博客文章,抱歉。
    猜你喜欢
    • 2017-02-06
    • 2017-05-16
    • 1970-01-01
    • 2019-02-12
    • 2019-01-11
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多