Github源码地点:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch
前三部分弄完,我们已经可以对内存数据进行CRUD的根基操纵,并且可以在asp.net core 2中集成Nlog了。
下面继续:
Entity Framework Core 2.0Entity Framework 是ORM(Object-Relational-Mapping)。ORM是一种让你可以使用面向东西的范式对数据库进行盘问和操纵。
简单的情况下,ORM可以把数据库中的表和Model东西一一映射起来;也有对照庞大的情况,ORM允许使用OO(面向东西)成果来做映射,例如:Person作为基类,Employee作为Person的派生类,他们俩可以在数据库中映射成一个表;或者在没有担任的情况下,数据库中的一个表可能和多个类有映射关系。
EF Core 不是 EF6的升级版,这个大家应该知道,EF Core是轻量级、具有很好的扩展性的,并且是跨平台的EF版本。
EF Core 目前有很多Providers,所以撑持很多种数据库,包孕:MSSQL,SQLite,SQL Compact,Postgres,MySql,DB2等等。而且还有一个内存的Provider,用于测试和开发。开发UWP应用的时候也可以使用EF Core(用SQLite Provider)。
EF Core撑持两种模式:
Code First:简单理解为 先写C#(Model),然后生成数据库。
Database First:此刻数据库中成立表,然后生成C#的Model。
由于用asp.net core 2.0开发的项目根基都是新项目,所以建议使用Code First。
创建 EntityEntity就是普通的C#类,就像Dto一样。Dto是与外界打交道的Model,entity则不一样,有一些Dto的计算属性我们并不像生存在数据库中,所以entity中没有这些属性;而数据从entity通报到Dto后某些属性也会和数据库里面的形式不一样。
首先把我们本来的Product和Material这两个Dto的名字重构一下,改成ProductDto和MaterialDto。
成立一个Entities文件夹,在里面成立Product.cs:
namespace CoreBackend.Api.Entities { public class Product { public int Id { get; set; } public string Name { get; set; } public float Price { get; set; } } }
DbContext
EFCore使用一个DbContext和数据库打交道,它代表着和数据库之间的一个Session,可以用来盘问和生存我们的entities。
DbContext需要一个Provider,以便能访谒数据库(这里我们就用LocalDB吧)。
我们就成立一个DbContext吧(大一点的项目会使用多个DbContext)。成立MyContext并集成DbContext:
namespace CoreBackend.Api.Entities { public class MyContext : DbContext { public DbSet<Product> Products { get; set; } } }
这里我们为Product成立了一个类型为DbSet<T>的属性,它可以用来盘问和生存实例(针对DbSet的Linq盘问语句将会被解释成针对数据库的盘问语句)。
因为我们需要使用这个MyContext,所以就需要先在Container中注册它,然后就可以在依赖注入中使用了。
打开Startup.cs,改削ConfigureServices,添加这一句话:
services.AddDbContext<MyContext>();
使用AddDbContext这个Extension method为MyContext在Container中进行注册,它默认的生命周期使Scoped。
但是它如何连接数据库?这就需要连接字符串,我们需要为DbContext供给连接字符串,这里有两种方法。
第一种是在MyContext中override OnConfiguring这个要领:
namespace CoreBackend.Api.Entities { public class MyContext : DbContext { public DbSet<Product> Products { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("xxxx connection string"); base.OnConfiguring(optionsBuilder); } } }
此中的参数optionsBuilder供给了一个UseSqlServer()这个要领,它报告Dbcontext将会被用来连接Sql Server数据库,在这里就可以供给连接字符串,这就是第一种要领。
第二种要领:
先概略看一下DbContext的源码的界说:
namespace Microsoft.EntityFrameworkCore { public class DbContext : IDisposable, IInfrastructure<IServiceProvider>, IDbContextDependencies, IDbSetCache, IDbContextPoolable { public DbContext([NotNullAttribute] DbContextOptions options);
有一个Constructor带有一个DbContextOptions参数,那我们就在MyContext种成立一个Constructor,并overload这个带有参数的Constructor。