Entity framework .net core-WebApp和EF数据层分离不起作用
我正在尝试在.NETCore中创建一个新项目。我希望在我的数据项目中包含所有与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核心和.
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"
}
}
}
}
}