第一个例子使用了一个Book类型,把这种类型映射到SQL Server数据库中的Books表。把记录写到数据库,然后读取、更新和删除它们。
在第一个示例中,首先创建数据库或者从应用程序创建数据库。为了先创建数据库,可以使用Visual Studio 2017中的SQL Server Object Explorer。选择数据库实例(localdb)\MSSQLLocalDB(随Visual Studio一起安装),单击树视图中的Databases节点,然后选择Add New Database。示例数据库WroxBooks只有一个表Books。
为了创建Books表,可以在WroxBooks数据库中选择Tables节点,然后选择Add New Table。使用如图所示的设计器,或者在T-SQL编辑器中输入SQL DDL语句,就可以创建Books表。下面的代码片段显示了创建表的T-SQL代码。单击Update按钮,可以将更改提交到数据库。
CREATE TABLE [dbo].[Table] (
[BookId] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (50) NOT NULL,
[Publisher] NVARCHAR (25) NULL,
CONSTRAINT [PK_Books] PRIMARY KEY CLUSTERED ([BookId] ASC)
);
本章使用的示例应用程序都是.NET Core控制台应用程序,使用以下依赖项和名称空间:
依赖项
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFramework.Design
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging.Console
名称空间
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.ChangeTracking
Microsoft.EntityFrameworkCore.Diagnostics
Microsoft.EntityFrameworkCore.Infrastructure
Microsoft.EntityFrameworkCore.Metadata.Builders
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
System
System.Collection.Generic
System.ComponentModel.DataAnnotations
System.ComponentModel.DataAnnotations.Schema
System.Linq
System.Threading.Tasks
1. 创建模型
访问Books表的BookSamples示例应用程序是一个.NET Core控制台应用程序。在这个应用程序中,Book类是一个简单的实体类型,定义了三个属性。BookId属性映射到表的主键,Title属性映射到Title列,Publisher属性映射到Publisher列。对于Title属性,应用Required属性是因为映射列在数据库中定义为NOT NULL。使用StringLength属性应用Title和Publisher属性的长度。这也映射到数据库中的列。为了把类型映射到Books表,将Table特性应用于类型:
[Table("Books")]
public class Book
{
public int BookId { get; set; }
[Required]
[StringLength(50)]
public string Title { get; set; }
[StringLength(25)]
public string Publisher { get; set; }
}
2. 约定、注释和流利API
EF Core使用了三个概念来定义模型:约定、注释和流利API。按照约定,有些事情会自动发生。例如,用Id前缀命名int或Guid类型的属性,将该属性映射到主键。
可以使用注释重写约定——指定特性。前面的例子使用Table特性将Book类型映射到Books表。还有一个映射到表格的约定:使用上下文的属性名。下一节将展示如何创建上下文。并不是每个约定都有注释。还使用了Required和StringLength特性。注释比约定更强大;可以做得更多。
除了使用注释,还可以使用流利API,这意味着配置是通过代码完成的,而不是使用特性完成的。在流利API中,可以使用方法的返回值来调用下一个方法。用于EF Core的流利API比注释更强大;可以做得更多。
3. 创建上下文
通过创建BooksContext类,实现了Book表与数据库的关系。这个类派生自基类DbContext。BooksContext类定义了DbSet<Book>类型的Books属性。这个类型允许创建查询,添加Book实例,存储在数据库中。要定义连接字符串,可以重写DbContext的OnConfiguring方法。在这里,UseSqlServer扩展方法将上下文映射到SQL Server数据库:
public class