前言:
大家都習慣在程序中生成對應的model來對數據庫進行操作,所以如何快速的生成數據庫表的對應model,是基礎之一。總結了一下在我的認知中大概是這個結構:
Db first方式:
先創建好對應的數據庫通過數據庫來生成對應的Model。
1 創建數據庫
大家可根據自己的需要生成對應的數據庫,這里只做演示所以使用官方給的SqlServer數據庫腳本:
CREATE DATABASE [Blogging];
GO
USE [Blogging];
GO
CREATE TABLE [Blog] (
[BlogId] int NOT NULL IDENTITY,
[Url] nvarchar(max) NOT NULL,
CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId])
);
GO
CREATE TABLE [Post] (
[PostId] int NOT NULL IDENTITY,
[BlogId] int NOT NULL,
[Content] nvarchar(max),
[Title] nvarchar(max),
CONSTRAINT [PK_Post] PRIMARY KEY ([PostId]),
CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([BlogId]) ON DELETE CASCADE
);
GO
INSERT INTO [Blog] (Url) VALUES
('http://blogs.msdn.com/dotnet'),
('http://blogs.msdn.com/webdev'),
('http://blogs.msdn.com/visualstudio')
GO
執行完了之后看一下效果:
表結構(極其簡單):
需要的數據庫創建完畢!
2 生成對應Model
在.net core核心包中已經包含了ef關於sqlserver的包,所以不需要導入任何包即可,如果你使用別的數據庫則安裝對應的包即可。在控制台中執行:
其中-OutputDir "Models"只將生成的文件放在Models中。
沒什么問題,可以正常用了。
Code First方式:
先寫好對應的Model,然后創建到數據庫。
1 創建Model類
根據自己的需求寫好類:
因為偷懶,所以只寫了一個類。。。
2 創建DbContext
個人把DbContext理解為一個中控類,可以通過它來對數據庫進行操作,這個可能理解有誤。直接上圖:
比較簡單哈,把記得所有實體類都加進去就ok啦。
3 字段限制
3.1 特性限制
在正常的數據庫中我們會對字段加許多的限制,比如長度最長為x,不可為空,設置主鍵等等。如果我們使用特性來進行約束那應該是這樣的:
這樣的話看上去比較混亂,用大佬們的話來說可能是職責不單一?應該是。總之這樣是不好的。
3.2 Fluent API限制
所以我們要在DbContext中對字段進行限制,ef core有一套叫Fluent API的東西,比較方便,上圖:
在OnModelCreating中加上限制之后和使用特性限制的效果是一致的。
3.3 限制類限制
但是當你的一個表字段比較多並且限制和表關系也非常多的時候,OnModelCreating中就會有很多行,不方便閱讀,所以有了限制類(我自己起的..)這個東西:
繼承於IEntityConfiguration,實現Configure方法,在這個方法中使用Fluent API進行限制就可以了,這樣每個表的限制對應一個類比較方便閱讀。
遷移命令
一種是使用CLI,一種是使用nuget,命令寫法不一樣而已,結果都一致。當然在這之前我們需要注入一下DbContext:
1 CLI方式:
在對應文件夾打開命令行執行dotnet ef migrations add name和dotnet ef database update 看結果:
我們需要的庫已經建立完成了。
2 Nuget方法:
在nuget中執行:add-migration name和update-database即可,結果都一樣不用看了。
遷移生成的文件介紹
第一次執行dotnet ef migrations add name時cli會自動創建migrations文件夾里面包含兩個文件。
MyDbContextModelSnapshot文件是快照文件,記錄第一次遷移時的數據庫結構,以日期命名的文件為修改文件,記錄每一次對數據庫修改了哪些地方,如果遷移之后更新數據庫之前發現還需要更改可以使用remove進行回滾。
具體回滾操作可使用:dotnet ef migrations remove
結語
只有在平時使用的時候,因為各種原因會遇到各種各樣的奇葩問題,這里就不列舉了,遇到的時候就得面向Search開發了,一般都是粗心錯誤,一般都能找到解決方案。
今天就先寫到這里,希望可以幫到大家,如果幫不到就算我記筆記了。。。
相關資料
FluentAPI文檔:https://www.learnentityframeworkcore.com/configuration/fluent-api
EFCore創建模型部分:https://docs.microsoft.com/zh-cn/ef/core/modeling/
官方案例:https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db?tabs=visual-studio