在.NET Core类库项目中使用Entity Framework Core执行存储过程






4.80/5 (8投票s)
在.NET Core类库项目中使用Entity Framework Core执行存储过程
引言
在这篇文章中,我想向您展示如何在数据访问层库核心项目中执行存储过程。
必备组件
请确保您已在计算机上安装了所有先决条件。如果没有,请逐一下载并安装所有软件。
首先,从此链接下载并安装Visual Studio 2015 Update 3。
如果您已安装Visual Studio 2015但尚未更新到Update 3,请从此链接下载并安装Visual Studio 2015 Update 3。
下载并安装.NET Core 1.0.1
问题
Entity Framework Core 1.0.0 RTM 仍然不支持类库项目的迁移。有关上述问题的更多信息,请参考以下链接:
解决方案
步骤 1
安装所有必要的组件后,使用.NET Core模板创建一个示例ASP.NET Core应用程序项目。
我们可以在此Web应用程序中使用我们的类库项目。首先,您需要创建两个.NET Core库项目——一个用于业务逻辑,另一个用于数据访问层。
按照相同的步骤创建数据访问层库项目。最终,我们的项目结构如下所示
删除现有代码,并在您的业务库项目的project.json文件中添加以下代码段
{
"version": "1.0.0-*",
"dependencies": {
"NETStandard.Library": "1.6.0"
},
"frameworks": {
"netcoreapp1.0": {}
}
}
我们需要将我们的类库创建为.NET Core应用程序项目。为此,您需要在您的数据访问层库的project.json文件中添加以下代码。
{
"buildOptions": {
"emitEntryPoint": true
},
"frameworks": {
"netcoreapp1.0": {}
},
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.1",
"type": "platform"
},
"Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0"
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-preview2-final"
}
}
}
您还需要添加一个`static` `void` `main()` 方法来完成.NET Core应用程序。为此,您需要在您的类库项目中添加一个空的program.cs文件。请参考以下代码
public class Program
{
public static void Main(string[] args)
{
}
}
第二步
在SQL Server中创建一个数据库和表以及存储过程。请在您的SQL Server中运行以下脚本
USE [master]
GO
/****** Object: Database [ContactDB] Script Date: 2/10/2017 12:22:09 PM ******/
CREATE DATABASE [ContactDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'ContactDB', _
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ContactDB.mdf' , _
SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'ContactDB_log', _
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ContactDB_log.ldf',_
SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [ContactDB] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [ContactDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [ContactDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [ContactDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [ContactDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [ContactDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [ContactDB] SET ARITHABORT OFF
GO
ALTER DATABASE [ContactDB] SET AUTO_CLOSE ON
GO
ALTER DATABASE [ContactDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [ContactDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [ContactDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [ContactDB] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [ContactDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [ContactDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [ContactDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [ContactDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [ContactDB] SET ENABLE_BROKER
GO
ALTER DATABASE [ContactDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [ContactDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [ContactDB] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [ContactDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [ContactDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [ContactDB] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [ContactDB] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [ContactDB] SET RECOVERY SIMPLE
GO
ALTER DATABASE [ContactDB] SET MULTI_USER
GO
ALTER DATABASE [ContactDB] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [ContactDB] SET DB_CHAINING OFF
GO
ALTER DATABASE [ContactDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [ContactDB] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
USE [ContactDB]
GO
/****** Object: Table [dbo].[Contacts] Script Date: 2/10/2017 12:22:09 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Contacts](
[ContactID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](100) NOT NULL,
[LastName] [varchar](100) NULL,
[ContactNo1] [varchar](20) NOT NULL,
[ContactNo2] [varchar](20) NULL,
[EmailID] [varchar](200) NULL,
[Address] [varchar](300) NULL,
CONSTRAINT [PK_Contacts] PRIMARY KEY CLUSTERED
(
[ContactID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, _
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: StoredProcedure [dbo].[GetContactList] Script Date: 2/10/2017 12:22:10 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetContactList]
AS
SET NOCOUNT ON;
BEGIN
SELECT
[ContactID]
,[FirstName]
,[LastName]
,[ContactNo1]
,[ContactNo2]
,[EmailID]
,[Address]
FROM Contacts
END
GO
USE [master]
GO
ALTER DATABASE [ContactDB] SET READ_WRITE
GO
步骤 3
现在我们可以使用以下dotnet `ef` 命令生成实体。
`ef` 命令现在已不存在,您需要使用以下 dotnet 命令:
dotnet ef dbcontext scaffold -c ContactDbContext -o Models -f "Data Source=yourdatasource;
Initial Catalog=ContactDB;User ID=youruserid;Password=yourpassword"
Microsoft.EntityFrameworkCore.SqlServer
其中 Models 是您想要在数据层项目中创建的包含所有实体的文件夹名称。
要执行上述命令,您需要打开命令提示符。转到您的数据访问层项目路径并使用上述命令。请查看以下屏幕截图以了解更多详细信息
当您在执行上述命令后在命令提示符中看到“Done”时,则会在我们的数据访问层项目中创建一个名为“Models”的文件夹,其中包含数据库实体。请参见以下屏幕截图
打开“ContactDbContext.cs”文件,您将看到您在上述`ef` 命令提示符中指定的SQL连接字符串和相关的联系人实体
好的,我们的数据访问层完成了。
步骤 4
在业务层项目中添加您的数据访问引用,并在您的Web项目中添加您的业务层引用。
步骤 5
现在我创建了一个扩展类,用于将数据库对象映射到我们的实体框架实体。
步骤 6
在业务层类库中创建一个名为“IContactRepository.cs”的接口
步骤 7
创建一个名为“ContactRepository.cs”的存储库并实现上述接口
就是这样!我们现在将使用.NET Core类库项目来使用我们的存储过程。
希望您喜欢这篇文章。