Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework .net core-WebApp和EF数据层分离不起作用_Entity Framework_Ef Code First_Asp.net Core_Database Migration - Fatal编程技术网

Entity framework .net core-WebApp和EF数据层分离不起作用

Entity framework .net core-WebApp和EF数据层分离不起作用,entity-framework,ef-code-first,asp.net-core,database-migration,Entity Framework,Ef Code First,Asp.net Core,Database Migration,我正在尝试在.NETCore中创建一个新项目。我希望在我的数据项目中包含所有与EF相关的内容,如下所示: Solution -- Project.Data -- Project.WebApp -- Project.AnotherWebApp 不幸的是,我遇到以下错误: 尝试在数据项目上运行迁移(dotnet ef migrations add init)时,我遇到以下错误: 无法在启动项目“MyProject.Data”上调用此命令。 实体框架工具的此预览不支持上的命令 ASP.NET核心和.

我正在尝试在.NETCore中创建一个新项目。我希望在我的数据项目中包含所有与EF相关的内容,如下所示:

Solution
-- Project.Data
-- Project.WebApp
-- Project.AnotherWebApp
不幸的是,我遇到以下错误:

尝试在数据项目上运行迁移(dotnet ef migrations add init)时,我遇到以下错误:

无法在启动项目“MyProject.Data”上调用此命令。 实体框架工具的此预览不支持上的命令 ASP.NET核心和.NET核心应用程序中的类库项目。看见 详情及 变通办法

不幸的是,链接中介绍的两种解决方法都不起作用

另一方面,在WebApp上运行迁移命令时,我遇到以下错误: 目标项目“MyProject.Portal”与迁移程序集“MyProject.Data”不匹配。更改目标项目或更改迁移程序集

使用DbContextOptionsBuilder更改迁移程序集。例如。 选项。使用SQLServer(连接,b=> b、 MigrationAssembly(“MyProject.Portal”))。默认情况下,迁移 assembly是包含DbContext的程序集。改变你的目标 使用包管理器将项目导入到迁移项目 控制台的默认项目下拉列表,或通过执行“dotnet ef” 从包含迁移项目的目录中

理想情况下,我如何才能让它工作,以便在数据项目上运行迁移

非常感谢您的帮助, 尼克

理想情况下,我如何才能让它工作,以便在数据项目上运行迁移

实体框架核心当前不支持在类库上运行迁移,因为迁移需要应用程序。以下解决方法创建了一个只有一个作业的应用程序:运行迁移

数据层 这是一个非常简单的数据层,包含上下文和简单实体

数据层/MyContext.cs 数据层迁移应用程序 这个小程序运行迁移

我们从这个项目的目录运行
dotnet ef迁移…
dotnet ef数据库…
。创建迁移和更新数据库时,这两个命令都使用
ConfigureServices

运行迁移或更新都不需要使用
Configure
方法。相反,它严格地允许我们使用
dotnet运行
对数据库进行测试读取

Datalayer.Migrations/Program.cs Datalayer.Migrations/project.json
当您尝试解决方法时会发生什么?我在这方面没有问题。请问您使用了哪种解决方法?这两种解决方案都需要一个主功能,对吗?根据记忆,我相信这是解决方案1。我创建了一个空白的ASP.NET核心Web应用程序,然后删除了所有我不需要的东西。您确实需要一个
Main
函数和
Startup
类来配置DbContext。解决方法可以更详细一点。我会再试一次!谢谢你,布拉德。你知道什么时候能修好吗?我曾尝试安装工具preview3,但这甚至让我无法再编译我的项目。这可能是一个最好针对EF核心团队的问题。库和工具的非RTM版本控制,再加上不完整的文档,使它变得不容易。不应该有变通办法。希望当所有部件都是RTM时,一切都更加稳定。非常感谢您非常详细的回答Shaun。在您的示例中,我看到DataLayer项目正在使用.NETStandart。这也能成为跨平台的.net核心吗?另外,使用您的解决方案意味着,一旦EF核心团队解决了这个问题(在类库上运行迁移等),我就可以简单地考虑迁移项目了?再次感谢@user2118781要回答您的第一个问题,
netstandard
是跨平台的,因此您不需要更改任何内容来实现跨平台。@user2118781“简单地考虑迁移项目”是什么意思?我的意思是,一旦EF核心团队解决了EF CLI工具无法在类库上运行迁移等问题,EF CLI工具就可以在类库上运行迁移等?这是一个已归档的bug,有望在下一个主要版本()中修复。因此,一旦解决了这个问题,迁移项目就可以从我的解决方案中删除,对吗?非常感谢你的建议和帮助@user2118781通过阅读您链接的帖子,似乎是的,如果EF核心团队能够针对类库运行
dotnet EF迁移
,那么您将能够从解决方案中删除迁移项目,并直接针对类库运行迁移。
using Microsoft.EntityFrameworkCore;

namespace DataLayer
{
    public class MyDataModel 
    {
        public Guid Id { get; set; }
    }

    public class MyContext : DbContext
    {
        public MyContext(DbContextOptions<MyContext> options)
            : base(options)
        {
        }

        public DbSet<MyDataModel> MyDataModels { get; set; }
    }
}
{
    "version": "1.0.0-*",
    "dependencies": {
        "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
        "NETStandard.Library": "1.6.0"
    },
    "frameworks": {
        "netstandard1.6": {}
    }
}
using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using DataLayer;

namespace DataLayer.Migrations
{
    public class Program
    {
        private readonly IConfigurationRoot _configuration;

        public Program()
        {
            _configuration = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json")
                .Build();
        }

        public static void Main(string[] args)
        {
            new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Program>()
                .Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {   
            var currentAssembly = "DataLayer.Migrations";
            var connectionString = 
                _configuration.GetConnectionString("DefaultConnection");

            services.AddDbContext<MyContext>(optionsBuilder =>
            {
                optionsBuilder.UseSqlite(
                    connectionString,
                    builder => builder.MigrationsAssembly(currentAssembly));
            });
        }

        public void Configure(MyContext context)
        {    
            var data = new MyDataModel
            {
                Id = System.Guid.NewGuid()
            };

            context.Add(data);
            context.SaveChanges();

            var count = context.MyDataModels.CountAsync().Result;
            Console.WriteLine($"There are {count} items.");
        }
    }
}
{
    "ConnectionStrings": {
        "DefaultConnection": 
            "Filename=MyDatabase.sqlite"
    }
}
{
    "version": "1.0.0-*",
    "buildOptions": {
        "emitEntryPoint": true,
        "copyToOutput": {
            "include": [
                "appsettings.json"
            ]
        }
    },
    "dependencies": {
        "DataLayer": "1.0.0-*",
        "Microsoft.AspNetCore.Hosting": "1.0.0",
        "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
        "Microsoft.Extensions.Configuration.Json": "1.0.0-*",
        "Microsoft.EntityFrameworkCore.Sqlite": "1.0.0",
        "Microsoft.EntityFrameworkCore.Design": {
            "type": "build",
            "version": "1.0.0-preview2-final"
        }
    },
    "tools": {
        "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
    },
    "frameworks": {
        "netcoreapp1.0": {
            "dependencies": {
                "Microsoft.NETCore.App": {
                    "type": "platform",
                    "version": "1.0.1"
                }
            }
        }
    }
}