说到Code-first,与其对应的就是Database-First,Model-First和Code-first。
1.Database First是基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件。
2.Model First 这种方式是先利用某些工具(如VS的EF设计器)设计出实体数据模型及他们之间的关系,然后再根据这些实体、关系去生成数据库对象及相关代码文件。
3.Code First 这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象,这种方式在前一篇文章已经简单说过了。但其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First是用可视化的方式描述了实体模型。
总之一点,Database-First就是先有数据库,从数据库入手,Model-First和Code-first先从代码入手,再生成数据库。
使用EF Core建立Code First,完成数据库迁移。
使用sqlite数据库
1.建立一个.net core web api项目
2.安装Microsoft.EntityFrameworkCore.Sqlite
3. 建立一个实体
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int age { get; set; }
}
4.建立DataContext
继承DbContext,初始化构造函数,继承base,再把User类写入
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{
}
public DbSet<User> Users { get; set; }
}
5.配置数据库
var connrection = "FileName=./demo.db";
services.AddDbContext<DataContext>(options =>
{
options.UseSqlite(connrection);
});
这里可以把Sqlite,换成别的数据库地址
注意:这里必须写 FileName=./demo.db 否则后面生成的时候报错
6.安装Microsoft.EntityFrameworkCore.tools
7. 配置appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"tools": {
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-previewl-final",
"imports": [
"portable-net 45+win8+dnxcore50",
"portable-net 45+win8"
]
}
}
}
8.在程序包管理器控制台中,输入Add-Migration xxx
9.在输入Update-Database,创建数据库完成
9.使用
别忘记 context.SaveChanges();
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication6.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
private readonly DataContext context;
public WeatherForecastController(ILogger<WeatherForecastController> logger,DataContext context)
{
_logger = logger;
this.context = context;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
User user = new User();
user.age = 15;
user.Id = 1;
user.Name = "张三";
context.Add(user);
context.SaveChanges();
var rng = new Random();
var n = context.Users.Where(n => n.Name == "张三");
foreach (var item in n)
{
Console.WriteLine(item.Name);
}
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
拓展
建立的类,最终都是要存到数据库中,上面的类并没有给字段增加注释或者数据的大小,主外键,约束等等条件,这些其实都可以增加,可以参考下面的链接。