在n层解决方案

时间:2016-11-07 18:28:56

标签: asp.net-core entity-framework-6 entity-framework-core

以下摘自Getting Started with ASP.NET Core and Entity Framework 6

  

“在ASP.NET Core 1.0中使用Entity Framework 6的推荐方法   应用程序是将EF6上下文和模型类放在一个类中   以完整为目标的库项目(.csproj项目文件)   框架。从ASP.NET Core添加对类库的引用   项目。 “

我的目标:是在n层解决方案中并排实施EntityFramework 6和EntityFramework Core。

解决方案:

  • 具有单个用户帐户身份验证的ASP.NET核心Web应用程序(.NET Framework)
  • 包含BLL&amp ;;的Windows类库(.dll)。 DAL

并排实施EF 6和EF Core的原因是:

  • EF Core 1.x实施问题(迁移,多对零关系)
  • ASP.NET Core中的单个用户帐户身份验证依赖于Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext
  • 此用例将实现当前依赖于Entity Framework 6的BreezeJS

我可以成功地将迁移添加到ASP.NET Core Web Application,如下所示:

PM> EntityFrameworkCore\Add-Migration InitialCreate

但是,在尝试将迁移添加到Windows类库时出现异常:

PM> EntityFramework\Add-Migration InitialCreate
  

使用“2”参数调用“SetData”的异常:“类型   'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject'   在程序集'Microsoft.VisualStudio.ProjectSystem.VS.Implementation中,   Version = 14.1.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'是   没有标记为可序列化。“在   C:\ SRC \ Hcs.NetCore \包\ EntityFramework.6.1.3 \ TOOLS \ EntityFramework.psm1:720   焦炭:5   + $ domain.SetData('startUpProject',$ startUpProject)   ...

如果我卸载ASP.NET Core Web Application,那么我可以通过以下步骤成功将EF6迁移添加到Windows类库中:

PM> EntityFramework\enable-migrations
PM> EntityFramework\add-migration InitialCreate

现在我在两个项目中都进行了初始迁移。

但是,当我运行ASP.NET核心Web应用程序时,我得到了几个运行时异常:

如果我在System.Data.Entity.DbContext的自定义实现中有无参数构造函数,那么我得到以下运行时异常:

  

System.Data.SqlClient.SqlException未被用户代码处理...
  消息=发生与网络相关或特定于实例的错误   建立与SQL Server的连接。找不到服务器或   无法访问。验证实例名称是否正确   SQL Server配置为允许远程连接。 (提供者:SQL   网络接口,错误:26 - 查找服务器/实例时出错   指定)......

通过删除默认构造函数来解决这个问题。

当我尝试注册用户时,抛出了以下异常:

  

System.Data.SqlClient.SqlException(0x80131904):无法打开数据库   登录请求“xxx”。登录失败。用户登录失败   YYY \ ZZZ”。在   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity   identity,SqlConnectionString connectionOptions,SqlCredential   凭证,Object providerInfo,String newPassword,SecureString   newSecurePassword,Boolean redirectedUserInstance,SqlConnectionString   userConnectionOptions,SessionData reconnectSessionData,   DbConnectionPool池,String accessToken,Boolean   

问:我是否走在正确的轨道上?这现在只是一个SQL Server身份验证问题吗?或者,还涉及其他问题吗?

2 个答案:

答案 0 :(得分:1)

EF6命令不知道如何使用ASP.NET核心项目(它们在编写时并不存在)。在运行EF6命令之前,您可能必须卸载这些项目。

您也可以明确指定-StartupProject作为解决问题的EF6项目。

答案 1 :(得分:1)

“异常调用”SetData“带有”2“参数异常:”

可以通过在以下命令中传递“Exception calling "SetData" with "2" argument(s) exception:”-StartupProject参数来解决-StartupProjectName

在Package Manager控制台中,将Default Project设置为包含EF6上下文的类库(在我的例子中为Dna.Net.Application.DAL.EF6)并执行:

PM> EntityFramework\enable-migrations -StartupProject Dna.Net.App.DAL.EF6
PM> EntityFramework\add-migration InitialCreate -StartupProjectName Dna.Net.App.DAL.EF6

“System.Data.SqlClient.SqlException(0x80131904):无法打开登录请求的数据库”xxx“。登录失败。”

在设计时,在保存新用户帐户时,点击 “System.Data.SqlClient.SqlException (0x80131904): Cannot open database "xxx” requested by the login. The login failed.” 按钮可以在运行时解决[Apply Migrations]例外问题。时间执行 Update-Database ,如下所示:

在Package Manager控制台中,将Default Project设置为包含EF6上下文的类库并执行:

PM> EntityFramework\Update-Database -StartupProject Dna.Net.Application.DAL.EF6

在程序包管理器控制台中,将“默认项目”设置为包含EF Core上下文的类库,然后执行:

PM> EntityFrameworkCore\Update-Database

此时,我可以使用Server Explorer或SQL Server Object Explorer检查数据库。

Update-Database命令为EFCore和EF6上下文创建了唯一的数据库。

此解决方案遵循Getting Started with ASP.NET Core and Entity Framework 6的示例应用程序部分中包含的准则,但有以下例外:

  • 我不需要实施IDbContextFactory

现在我可以成功执行以下测试:

  • 通过ASP.NET Core MVC个人用户帐户脚手架添加用户。
  • 修改(ASP.NET Core MVC scaffolded)HomeController.About()以将自定义实体持久化并检索到自定义System.Data.Entity.DbContext实现。
  • 修改About.cshtml以显示持久化的自定义实体。