網(wǎng)站首頁 編程語言 正文
1.什么是Fluent API?
EF中內(nèi)嵌的約定將POCO類映射到表。但是,有時(shí)您無法或不想遵守這些約定,需要將實(shí)體映射到約定指示外的其他對象,所以Fluent API和注解都是一種方法,這兩種方法是用來配置EF在映射屬性時(shí)繞開約定。Code first fluent API最常訪問通過重寫OnModelCreating方法在派生DbContext。
2.包含屬性和排除屬性
按照約定,數(shù)據(jù)模型中都包含一個(gè)getter和一個(gè)setter公共屬性。
2.1包含屬性
包含屬性官網(wǎng)解釋有點(diǎn)難以理解,我個(gè)人認(rèn)為在OnModelCreating方法配置包含Blog模型,那么當(dāng)我們調(diào)用Blog模型讀寫數(shù)據(jù)時(shí)候就會(huì)從連接數(shù)據(jù)庫中讀寫對應(yīng)Blog表。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(); }
2.2排除屬性
如果你不想往BlogMetadata上讀寫數(shù)據(jù),可以使用數(shù)據(jù)批注或者fluent API從模型中排除該實(shí)體類型。
2.2.1數(shù)據(jù)批注
namespace EFModeling.DataAnnotations.IgnoreType { class MyContext : DbContext { public DbSetBlogs { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public BlogMetadata Metadata { get; set; } } //讀寫不映射該實(shí)體 [NotMapped] public class BlogMetadata { public DateTime LoadedFromDatabase { get; set; } } }
2.2.2Fluent API
namespace EFModeling.FluentAPI.IgnoreType { class MyContext : DbContext { public DbSetBlogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { //Ignore方法就是讀寫不映射該實(shí)體 modelBuilder.Ignore (); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public BlogMetadata Metadata { get; set; } } public class BlogMetadata { public DateTime LoadedFromDatabase { get; set; } } }
3.主鍵
使用關(guān)系型數(shù)據(jù)庫時(shí)候,都會(huì)涉及到主鍵概念,用作每個(gè)實(shí)體實(shí)例的主要唯一標(biāo)識(shí)符。
3.1數(shù)據(jù)批注
namespace EFModeling.DataAnnotations.KeySingle { class MyContext : DbContext { public DbSetCars { get; set; } } class Car { //設(shè)置LicensePlate為主鍵 [Key] public string LicensePlate { get; set; } public string Make { get; set; } public string Model { get; set; } } }
3.2Fluent API
namespace EFModeling.FluentAPI.KeySingle { class MyContext : DbContext { public DbSetCars { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity () //設(shè)置LicensePlate為主鍵 .HasKey(c => c.LicensePlate); } } class Car { public string LicensePlate { get; set; } public string Make { get; set; } public string Model { get; set; } } }
4.生成值
有三個(gè)可用于屬性的值生成模式:
●無值生成:沒有值生成意味著,需始終提供要保存到數(shù)據(jù)庫的有效值。必須先將有效的值賦予新的實(shí)體,再將這些新的實(shí)體添加到上下文中。
●在添加時(shí)生成值:在添加時(shí)生成值,意思是為新實(shí)體生成值。
●在添加或更新時(shí)生成值:在添加或更新時(shí)生成值,意味著在每次保存該記錄(插入或更新)時(shí)生成新值。
注:如果想在數(shù)據(jù)庫端添加或更新時(shí)自動(dòng)生成值,我們可以通過觸發(fā)器和配置默認(rèn)值等方法生成。例如,如果指定在添加或更新時(shí)要生成DateTime屬性,則必須設(shè)置生成值的方法。若要執(zhí)行此操作,一種方法是配置GETDATE() 的默認(rèn)值以生成新行的值,然后即可使用數(shù)據(jù)庫觸發(fā)器在更新過程中生成值,如下面的示例觸發(fā)器所示:
USE [Blogging] GO /****** Object: Trigger [dbo].[Blog_Update_Trigger] Script Date: 2019/10/22 16:18:13 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER TRIGGER [dbo].[Blog_Update_Trigger] ON [dbo].[Blog] AFTER UPDATE AS BEGIN SET NOCOUNT ON; IF ((SELECT TRIGGER_NESTLEVEL()) > 1) RETURN; DECLARE @Id INT SELECT @Id = INSERTED.BlogId FROM INSERTED UPDATE dbo.Blog SET Updatetime = GETDATE() WHERE BlogId = @Id END
4.1數(shù)據(jù)批注
4.1.1無值生成
public class Blog { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int BlogId { get; set; } public string Url { get; set; } }
4.1.2在添加時(shí)生成值
public class Blog { public int BlogId { get; set; } public string Url { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public DateTime Inserted { get; set; } }
4.1.3在添加或更新時(shí)生成值
public class Blog { public int BlogId { get; set; } public string Url { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime LastUpdated { get; set; } }
4.2Fluent API
4.2.1無值生成
modelBuilder.Entity() .Property(b => b.BlogId) .ValueGeneratedNever();
4.2.2在添加時(shí)生成值
modelBuilder.Entity() .Property(b => b.Inserted) .ValueGeneratedOnAdd();
4.2.3在添加或更新時(shí)生成值
modelBuilder.Entity() .Property(b => b.LastUpdated) .ValueGeneratedOnAddOrUpdate();
原文鏈接:https://www.cnblogs.com/wzk153/p/11721194.html
相關(guān)推薦
- 2022-06-06 Ubuntu系統(tǒng)-FFmpeg安裝及環(huán)境配置
- 2022-08-12 Python學(xué)習(xí)之字典的創(chuàng)建和使用_python
- 2022-09-13 C/C++合并兩個(gè)升序鏈表的方式_C 語言
- 2022-12-10 Qt顯示QImage圖像在label上,并保持自適應(yīng)大小問題_C 語言
- 2022-12-21 k8s安裝CICD?devtron過程詳解_云其它
- 2023-02-07 C語言可變參數(shù)與內(nèi)存管理超詳細(xì)講解_C 語言
- 2022-09-09 Redis中ZSet的具體使用_Redis
- 2022-05-13 Centos error: cannot remove “core“: snap “core“ is
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支