ASP.NET?Core使用EF創(chuàng)建模型(包含屬性、排除屬性、主鍵和生成值)
1.什么是Fluent API?
EF中內(nèi)嵌的約定將POCO類映射到表。但是,有時您無法或不想遵守這些約定,需要將實(shí)體映射到約定指示外的其他對象,所以Fluent API和注解都是一種方法,這兩種方法是用來配置EF在映射屬性時繞開約定。Code first fluent API最常訪問通過重寫OnModelCreating方法在派生DbContext。
2.包含屬性和排除屬性
按照約定,數(shù)據(jù)模型中都包含一個getter和一個setter公共屬性。
2.1包含屬性
包含屬性官網(wǎng)解釋有點(diǎn)難以理解,我個人認(rèn)為在OnModelCreating方法配置包含Blog模型,那么當(dāng)我們調(diào)用Blog模型讀寫數(shù)據(jù)時候就會從連接數(shù)據(jù)庫中讀寫對應(yīng)Blog表。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>();
}2.2排除屬性
如果你不想往BlogMetadata上讀寫數(shù)據(jù),可以使用數(shù)據(jù)批注或者fluent API從模型中排除該實(shí)體類型。
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; }
}
//讀寫不映射該實(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方法就是讀寫不映射該實(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ù)庫時候,都會涉及到主鍵概念,用作每個實(shí)體實(shí)例的主要唯一標(biāo)識符。
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.生成值
有三個可用于屬性的值生成模式:
●無值生成:沒有值生成意味著,需始終提供要保存到數(shù)據(jù)庫的有效值。必須先將有效的值賦予新的實(shí)體,再將這些新的實(shí)體添加到上下文中。
●在添加時生成值:在添加時生成值,意思是為新實(shí)體生成值。
●在添加或更新時生成值:在添加或更新時生成值,意味著在每次保存該記錄(插入或更新)時生成新值。
注:如果想在數(shù)據(jù)庫端添加或更新時自動生成值,我們可以通過觸發(fā)器和配置默認(rèn)值等方法生成。例如,如果指定在添加或更新時要生成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
END4.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在添加時生成值
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Inserted { get; set; }
}4.1.3在添加或更新時生成值
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<Blog>()
.Property(b => b.BlogId)
.ValueGeneratedNever();4.2.2在添加時生成值
modelBuilder.Entity<Blog>()
.Property(b => b.Inserted)
.ValueGeneratedOnAdd();4.2.3在添加或更新時生成值
modelBuilder.Entity<Blog>()
.Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate();到此這篇關(guān)于ASP.NET Core使用EF創(chuàng)建模型的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET Core自動生成小寫破折號路由的實(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后如何打包生成跨平臺包
- Asp.net core WebApi 使用Swagger生成幫助頁實(shí)例
- 基于ASP.NET Core數(shù)據(jù)保護(hù)生成驗證token示例
- asp.net core實(shí)現(xiàn)在線生成多個文件將多個文件打包為zip返回的操作
相關(guān)文章
Asp.net開發(fā)之webform圖片水印和圖片驗證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了Asp.net開發(fā)之webform圖片水印和圖片驗證碼的實(shí)現(xiàn)方法,實(shí)現(xiàn)思路分為前后臺代碼和效果展示,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10
ASP.NET實(shí)現(xiàn)License Key輸入功能的小例子
當(dāng)我們安裝微軟的軟件,多數(shù)軟件是需要輸入license key。它有五個文本框,輸入完第一個文本框之后,光標(biāo)自動跳至下一個文本框。 Insus.NET今天也使用asp.net來模仿一個。呵呵。2013-03-03
Asp.net 通用萬級數(shù)據(jù)分頁代碼[修正下載地址]
在萬級數(shù)據(jù)量下的分頁代碼2008-10-10
python scrapy項目下spiders內(nèi)多個爬蟲同時運(yùn)行的實(shí)現(xiàn)
這篇文章主要介紹了python scrapy項目下spiders內(nèi)多個爬蟲同時運(yùn)行的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

