ASP.NET?Core使用EF創(chuàng)建模型(包含屬性、排除屬性、主鍵和生成值)
1.什么是Fluent API?
EF中內(nèi)嵌的約定將POCO類(lèi)映射到表。但是,有時(shí)您無(wú)法或不想遵守這些約定,需要將實(shí)體映射到約定指示外的其他對(duì)象,所以Fluent API和注解都是一種方法,這兩種方法是用來(lái)配置EF在映射屬性時(shí)繞開(kāi)約定。Code first fluent API最常訪問(wèn)通過(guò)重寫(xiě)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模型讀寫(xiě)數(shù)據(jù)時(shí)候就會(huì)從連接數(shù)據(jù)庫(kù)中讀寫(xiě)對(duì)應(yīng)Blog表。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>(); }
2.2排除屬性
如果你不想往BlogMetadata上讀寫(xiě)數(shù)據(jù),可以使用數(shù)據(jù)批注或者fluent API從模型中排除該實(shí)體類(lèi)型。
2.2.1數(shù)據(jù)批注
namespace EFModeling.DataAnnotations.IgnoreType { class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public BlogMetadata Metadata { get; set; } } //讀寫(xiě)不映射該實(shí)體 [NotMapped] public class BlogMetadata { public DateTime LoadedFromDatabase { get; set; } } }
2.2.2Fluent API
namespace EFModeling.FluentAPI.IgnoreType { class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { //Ignore方法就是讀寫(xiě)不映射該實(shí)體 modelBuilder.Ignore<BlogMetadata>(); } } 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ù)庫(kù)時(shí)候,都會(huì)涉及到主鍵概念,用作每個(gè)實(shí)體實(shí)例的主要唯一標(biāo)識(shí)符。
3.1數(shù)據(jù)批注
namespace EFModeling.DataAnnotations.KeySingle { class MyContext : DbContext { public DbSet<Car> Cars { 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 DbSet<Car> Cars { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Car>() //設(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è)可用于屬性的值生成模式:
●無(wú)值生成:沒(méi)有值生成意味著,需始終提供要保存到數(shù)據(jù)庫(kù)的有效值。必須先將有效的值賦予新的實(shí)體,再將這些新的實(shí)體添加到上下文中。
●在添加時(shí)生成值:在添加時(shí)生成值,意思是為新實(shí)體生成值。
●在添加或更新時(shí)生成值:在添加或更新時(shí)生成值,意味著在每次保存該記錄(插入或更新)時(shí)生成新值。
注:如果想在數(shù)據(jù)庫(kù)端添加或更新時(shí)自動(dòng)生成值,我們可以通過(guò)觸發(fā)器和配置默認(rèn)值等方法生成。例如,如果指定在添加或更新時(shí)要生成DateTime屬性,則必須設(shè)置生成值的方法。若要執(zhí)行此操作,一種方法是配置GETDATE() 的默認(rèn)值以生成新行的值,然后即可使用數(shù)據(jù)庫(kù)觸發(fā)器在更新過(guò)程中生成值,如下面的示例觸發(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無(wú)值生成
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無(wú)值生成
modelBuilder.Entity<Blog>() .Property(b => b.BlogId) .ValueGeneratedNever();
4.2.2在添加時(shí)生成值
modelBuilder.Entity<Blog>() .Property(b => b.Inserted) .ValueGeneratedOnAdd();
4.2.3在添加或更新時(shí)生成值
modelBuilder.Entity<Blog>() .Property(b => b.LastUpdated) .ValueGeneratedOnAddOrUpdate();
到此這篇關(guān)于ASP.NET Core使用EF創(chuàng)建模型的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET Core自動(dòng)生成小寫(xiě)破折號(hào)路由的實(shí)現(xiàn)方法
- ASP.NET Core 5中如何生成PDF文檔
- Asp.Net Core使用swagger生成api文檔的完整步驟
- 詳解ASP.NET Core 2.0 路由引擎之網(wǎng)址生成(譯)
- Asp.NetCore1.1版本去掉project.json后如何打包生成跨平臺(tái)包
- Asp.net core WebApi 使用Swagger生成幫助頁(yè)實(shí)例
- 基于ASP.NET Core數(shù)據(jù)保護(hù)生成驗(yàn)證token示例
- asp.net core實(shí)現(xiàn)在線(xiàn)生成多個(gè)文件將多個(gè)文件打包為zip返回的操作
相關(guān)文章
手把手教你AspNetCore WebApi認(rèn)證與授權(quán)的方法
這篇文章主要介紹了手把手教你AspNetCore WebApi認(rèn)證與授權(quán)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10防SQL注入 生成參數(shù)化的通用分頁(yè)查詢(xún)語(yǔ)句
前些時(shí)間看了玉開(kāi)兄的“如此高效通用的分頁(yè)存儲(chǔ)過(guò)程是帶有sql注入漏洞的”這篇文章,才突然想起某個(gè)項(xiàng)目也是使用了累似的通用分頁(yè)存儲(chǔ)過(guò)程。2010-07-07AspNetPager與Socut.Data使用實(shí)例代碼
最近對(duì)AspNetPager與Socut.Data這兩個(gè)控件產(chǎn)生了濃厚的興趣,這兩個(gè)控件配合可以減輕很多程序員編寫(xiě)代碼的壓力。ASpNetPager為分頁(yè)控件,而Socut.Data為數(shù)據(jù)操作控件,ACCESS,MSSQL都可以。2008-07-07Visual Studio(VS2017)配置C/C++ PostgreSQL9.6.3開(kāi)發(fā)環(huán)境
這篇文章主要為大家詳細(xì)介紹了Visual Studio(VS2017)配置C/C++,PostgreSQL9.6.3開(kāi)發(fā)環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07asp.net開(kāi)發(fā)中怎樣去突破文件依賴(lài)緩存
緩存大家用的太多了,簡(jiǎn)單至一個(gè)用static修飾的變量都可以視作緩存,復(fù)雜至Memcached等大數(shù)據(jù)量的緩存。2011-07-07asp.net操作Word實(shí)現(xiàn)批量替換
這篇文章主要介紹了asp.net操作Word實(shí)現(xiàn)批量替換的方法,需要的朋友可以參考下2015-10-10ASP.NET服務(wù)器端控件RadioButtonList,DropDownList,CheckBoxList的取值、賦值
這三個(gè)控件都有一個(gè)Items集合,可以用 RepeatLayout 和 RepeatDirection 屬性來(lái)控制列表的呈現(xiàn)形式2013-10-10ASP.Net2.0 GridView 多列排序,顯示排序圖標(biāo),分頁(yè)
ASP.Net2.0 GridView 多列排序,顯示排序圖標(biāo),分頁(yè)...2006-09-09DataGridView中CheckBox實(shí)現(xiàn)某一列單選
DataGridView中CheckBox實(shí)現(xiàn)某一列單選,需要的朋友可以參考一下2013-02-02