如何使用数据库优先方法将EF 6.2中的现有数据项目加载到Web API Core2控制器中



所以我有一个EF应用程序,它运行得很好,但它是厚客户端,我想基于服务并使用Azure和MS的Core 2框架。我将开箱即用地构建Web API。测试它是否有效,它做得很好。现在,让我们添加一个对我的DataAccess库的引用,该库使用EF。Oops忘记了通过NuGet将EF添加到新项目中,请这样做。它继续告诉我,它找不到我对连接字符串的引用。好的,所以我在appsettings.json中将它连接到一个本地实例数据库,如下所示(从WPF客户端项目中已经工作的内容复制):

{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
"ConnectionStrings": {
"ExpensesEntities": "metadata=res://*/Expenses.csdl|res://*/Expenses.ssdl|res://*/Expenses.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=Expenses;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
}
}

我把我的创业公司改成这样:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddScoped(_ => new MoneyEntry.DataAccess.ExpensesEntities());
}

我可以看到它试图进入我的上下文,并打破说

'FileNotFoundException: Could not load file or assembly
'System.Configuration.ConfigurationManager, 
Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. 
The system cannot find the file specified.'

然而,它打破了EF上下文的这一部分

public ExpensesEntities()
: base("name=ExpensesEntities")
{
}

所以我很确定我只需要按照正确的顺序引用连接字符串,而我在放置连接字符串或某种类型的配置加载时出错了。我一直在关注这条线索:https://learn.microsoft.com/en-us/ef/core/miscellaneous/connection-strings

我的另一个担忧是,我可以混合EF框架吗?我在EF 6.1.3中编写了我的数据访问层,我刚刚升级到6.2,但我知道.NET Core有自己的库。我可以将EF.NET Core与EF.NET Framework混合使用吗?或者我应该尝试在Core中重写我的DAL吗?不管是什么,它似乎都不喜欢它,我可能只是想看看我是否可以从头开始添加一个自包含的模型,看看它是如何工作的。但我想看看人们是否有在新的.NET Core 2上混合框架的经验。

编辑11-15-17好的,请关注此链接https://learn.microsoft.com/en-us/aspnet/core/data/entity-framework-6#handle-连接字符串有点帮助。然而,他们做的是一个MVC站点,而不是API,假设代码优先的方法,而且你想要依赖项注入。为了简化,你能先用数据库做这件事,然后让应用程序设置来识别EF连接字符串吗?在过去,你只需要制作另一个项目,将EF部分复制并粘贴到新的应用程序配置中,如果它有效的话。由于ASP.NET Core 2使用了appsettings,我尝试了一个更简单的连接字符串,如:

"Expenses": "Server=.;Database=Expenses;Trusted_Connection=True;MultipleActiveResultSets=true"

我使用了一个最简单的表,它只有一个Id int属性和一个字符串Description属性。然后,当我遇到一个断点,试图获取数据时,它会轰炸控制器,如下所示:

var data = await _context.tdType.ToListAsync();
return View(data);

并假设我需要定义一个密钥,并且首先使用代码。我是否假设EF Core不能处理模型优先的行为,并且我需要装饰使用代码优先方法生成的POCO?如果是这样的话,在这一点上,我可能需要首先用代码重新创建我的整个EF,并考虑如何用它处理过程和视图。

我认为理解这一点的关键是我使用的这个模型有视图、函数和过程。根据我对代码的了解,首先可以更新DbSet对象的映射选项,以覆盖Insert、update和Delete选项。但是,与表没有直接关系,但有多种操作的视图、函数和过程确实有点神秘。EF Core可能只是功能不够全面。但出于这个原因,我认为现有的EF 6.2可以解决这个问题。

您不能从以下文档直接在.Net Core中使用EF 6上下文:

不能将EF6上下文放在ASP.NET Core项目中,因为.NET Core项目不支持EF6命令(如"启用迁移")所需的所有功能。

但是,您可以使用另一个程序集使用EF 6:

在ASP.NET Core应用程序中使用Entity Framework 6的推荐方法是将EF6上下文和模型类放在以完整框架为目标的类库项目中

但请注意,这实际上会使您成为.Net Core项目依赖于完整的.Net框架,因此它不再是跨平台的。

如果由于跨平台功能,您不打算使用.Net核心,并且您在EF 6代码上投入了大量资金,那么您可能会考虑创建aps.Net全框架web api服务,以便将您的应用程序从厚客户端重写为瘦客户端/web api架构。

简而言之,EF Core 2.1还没有准备好生产,因为它没有很多主要功能,比如:

  • 多对多关系:https://github.com/aspnet/EntityFrameworkCore/issues/1368

  • 延迟加载:https://github.com/aspnet/EntityFrameworkCore/issues/3797

我们曾尝试在新项目中使用EF Core 2.1,但效果不佳。
我认为您应该仔细查看路线图和问题列表:
路线图
问题列表

另一种选择是使用OrmLite或Dapper:https://github.com/ServiceStack/ServiceStack.OrmLite
https://github.com/StackExchange/Dapper

我知道OrmLite和Dapper不是你想要的,但它们是目前网络核心最稳定的库。我们已经完成了两个项目,一个是dapper,另一个是OrmLite
希望得到帮助。

您可以使用最新的EF在classic.net框架上创建新的lib项目。在那个用例"CodeFirst from Database"之后,从数据库创建实体和dbcontext类。将您生成的代码移动到新的.netcore或.netstandart项目。也许dbcontext需要一些更改,添加连接字符串。它有效。当我将旧项目迁移到新的.netcore项目时,我就这样做了。祝你好运)

相关内容

最新更新