IDE:VS2019
.Net版本:.Net Core3.1
數據庫:Sqlite
1.創建一個.net core控制檯的項目,並創建兩個model,TeacherModel和StudentModel,其中主程序集引用Models程序集:
2.兩個model都有名字和id等信息:
public class TeacherModel
{
public int ID { set; get; }
public string Name { set; get; }
}
public class StudentModel
{
public int ID { set; get; }
public string Name { set; get; }
}
3.通過NuGet安裝兩個包。
在Models安裝:
在EntityFrameworkDemo安裝:
4.添加一個Context類:
public class InfoManagementContext: DbContext
{
public DbSet<StudentModel> Students { get; set; }
public DbSet<TeacherModel> Teachers { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=info.db");
}
5.進入到程序包管理控制檯界面:
生成項目後執行下面兩個命令:
執行成功後,會生成兩個新內容,info.db和Migrations文件夾下的內容,其中Migrations在上線前一般可以隨意刪除,但是後期會涉及到數據遷移和數據庫更新的問題,不建議刪除,以防出現問題:
6.將info.db做下設置:
7.在Program添加一段測試代碼:
class Program
{
static void Main(string[] args)
{
var db = new InfoManagementContext();
//新增
db.Teachers.Add(new TeacherModel() { Name = "教師1" });
db.Students.Add(new StudentModel() { Name = "學生1" });
db.SaveChanges();//該方法默認情況下會封裝到一個事務裏面
//讀取
var teacher = db.Teachers.OrderBy(x => x.ID).First();
var student = db.Students.OrderBy(x => x.ID).First();
//修改
teacher.Name = "教師2";
student.Name = "學生2";
db.SaveChanges();
//讀取
teacher = db.Teachers.OrderBy(x => x.ID).First();
student = db.Students.OrderBy(x => x.ID).First();
//刪除
db.Teachers.Remove(teacher);
db.Students.Remove(student);
db.SaveChanges();
}
}
8.生成代碼並執行,使用sqlite工具觀察數據庫的info.db這個數據庫的變化:
我用的sqlite工具是SQLiteStudio。
基本的使用流程大概就是如此,這裏Migrations這個文件夾在生成了數據庫之後是可以刪除的。
有三個問題,需要解決:
1.主鍵問題,有單一主鍵和複合主鍵
單一主鍵只需要在屬性上加特性[Key]或者重寫DbContext就可以了:
public class InfoManagementContext: DbContext
{
public DbSet<StudentModel> Students { get; set; }
public DbSet<TeacherModel> Teachers { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=info.db");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key });
base.OnModelCreating(modelBuilder);
}
}
或者
public class StudentModel
{
[Key]
public int Key { set; get; }
public int ID { set; get; }
public string Name { set; get; }
public int TeacherID { set; get; }
}
複合主鍵,則只能在重寫OnModelCreating裏面添加:
modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key, x.ID });
2.將不同的表放到不同的數據庫裏面。這個例子裏面兩張表都放到了一個庫裏面,如果有分庫的需求,那麼就多寫一個DbContext,然後分別指定Context執行生成庫操作:
Add-Migration InitialCreate -Context InfoManagementContext
Update-Database -Context InfoManagementContext
3.表更新問題。如果要給某張表增加一列,原本的數據不能刪除,解決方法是使用Add-Migration的參數Update-Database,然後執行更新數據庫的命令Update-Database:
文件夾下會多一個更新數據庫的類:
這樣,數據庫就更新了。