溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET?Core中如何使用EF創(chuàng)建模型

發(fā)布時(shí)間:2022-04-09 08:55:14 來(lái)源:億速云 閱讀:361 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“ASP.NET Core中如何使用EF創(chuàng)建模型”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“ASP.NET Core中如何使用EF創(chuàng)建模型”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

1.必需和可選屬性

如果實(shí)體屬性可以包含null,則將其視為可選。如果屬性的有效值不可以包含null,則將其視為必需屬性。映射到關(guān)系數(shù)據(jù)庫(kù)架構(gòu)時(shí),必需的屬性將創(chuàng)建為不可為null的列,而可選屬性則創(chuàng)建為可以為null的列。

1.1約定

按照約定,.NET 類型可以包含null的屬性將配置為可選,而.NET類型不包含null的屬性將根據(jù)需要進(jìn)行配置。例如,具有.net值類型(int、decimal、bool等)的所有屬性都是必需的,而具有可為null的.net值類型(int?、decimal?、bool?等)的所有屬性都是配置為可選。

1.2數(shù)據(jù)批注

可以按如下所示將"約定"可以為"可選"的屬性配置為"必需":

namespace EFModeling.DataAnnotations.Required
{
    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
    }
    public class Blog
    {
        public int BlogId { get; set; }
        //加上這個(gè)批注,這個(gè)值就必需寫入
        [Required]
        public string Url { get; set; }
    }
}

1.3Fluent API

namespace EFModeling.FluentAPI.Required
{
    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Blog>()
                .Property(b => b.Url)
                //這個(gè)方法表示必需寫入
                .IsRequired();
        }
    }
    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
    }
}

2.最大長(zhǎng)度

配置最大長(zhǎng)度可為數(shù)據(jù)存儲(chǔ)提供有關(guān)要對(duì)給定屬性使用的相應(yīng)數(shù)據(jù)類型的提示。最大長(zhǎng)度僅適用于數(shù)組數(shù)據(jù)類型,如string和byte[]。例如前端傳統(tǒng)數(shù)據(jù)長(zhǎng)度遠(yuǎn)大于限定的長(zhǎng)度,則提示。

2.1約定

按照約定,應(yīng)由數(shù)據(jù)庫(kù)提供程序?yàn)閷傩赃x擇適當(dāng)?shù)臄?shù)據(jù)類型,即數(shù)據(jù)庫(kù)字段設(shè)置長(zhǎng)度多少,生產(chǎn)程序?qū)嶓w接受值時(shí)就限定長(zhǎng)度多少。對(duì)于具有長(zhǎng)度的屬性,數(shù)據(jù)庫(kù)提供程序通常將選擇允許最長(zhǎng)數(shù)據(jù)長(zhǎng)度的數(shù)據(jù)類型。例如,Microsoft SQL Server將對(duì)字符string屬性使用 nvarchar(max)(如果該列用作鍵,則會(huì)使用nvarchar(450))。

2.2數(shù)據(jù)批注

你可以使用數(shù)據(jù)批注為屬性配置最大長(zhǎng)度。此示例面向SQL Server,因此使用數(shù)據(jù)類型 nvarchar(500)。

namespace EFModeling.DataAnnotations.MaxLength
{
    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
    }
    public class Blog
    {
        public int BlogId { get; set; }
        //設(shè)置最大長(zhǎng)度
        [MaxLength(500)]
        public string Url { get; set; }
    }
}

2.3Fluent API

namespace EFModeling.FluentAPI.MaxLength
{
    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Blog>()
                .Property(b => b.Url)
                //設(shè)置最大長(zhǎng)度
                .HasMaxLength(500);
        }
    }
    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
    }
}

3.并發(fā)標(biāo)記

當(dāng)我們發(fā)現(xiàn)生產(chǎn)環(huán)境某個(gè)實(shí)體字段經(jīng)常處于并發(fā)當(dāng)中,我們可以批注一下為并發(fā)字段。

3.1約定

按照約定,屬性永遠(yuǎn)不會(huì)配置為并發(fā)標(biāo)記。

3.2數(shù)據(jù)注釋

您可以使用數(shù)據(jù)批注將屬性配置為并發(fā)標(biāo)記。

public class Person
{
   public int PersonId { get; set; }
    //并發(fā)標(biāo)記
    [ConcurrencyCheck]
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

3.3Fluent API

您可以使用熟知的API將屬性配置為并發(fā)標(biāo)記。

class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .Property(p => p.LastName)
            //并發(fā)標(biāo)記
            .IsConcurrencyToken();
    }
}
public class Person
{
    public int PersonId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

4.時(shí)間戳/行版本

時(shí)間戳是一個(gè)屬性類型,在每次插入或更新行時(shí),數(shù)據(jù)庫(kù)都會(huì)生成一個(gè)新值。此該屬性類型也被視為并發(fā)標(biāo)記。這可以確保在你和其他人修改了行數(shù)據(jù)時(shí)你會(huì)收到異常信息。

4.1約定

按照約定,屬性永遠(yuǎn)不會(huì)配置為時(shí)間戳。

4.2數(shù)據(jù)注釋

你可以使用數(shù)據(jù)批注將屬性配置為時(shí)間戳。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    //設(shè)置時(shí)間戳
    1649324459
    public byte[] Timestamp { get; set; }
}

4.3Fluent API

你可以使用熟知的API將屬性配置為時(shí)間戳。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(p => p.Timestamp)
            //設(shè)置時(shí)間戳
            .IsRowVersion();
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public byte[] Timestamp { get; set; }
}

5.陰影屬性

當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)不應(yīng)在映射的實(shí)體類型上公開(kāi)時(shí),陰影屬性非常有用。它們最常用于外鍵屬性,其中兩個(gè)實(shí)體之間的關(guān)系由數(shù)據(jù)庫(kù)中的外鍵值表示,但使用實(shí)體類型之間的導(dǎo)航屬性在實(shí)體類型上管理關(guān)系,可以通過(guò)ChangeTracker API獲取和更改影子屬性值:

context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;

可以通過(guò)EF.Property靜態(tài)方法在LINQ查詢中引用影子屬性:

var blogs = context.Blogs.OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));

5.1約定

如果發(fā)現(xiàn)了關(guān)系,但在依賴實(shí)體類中找不到外鍵屬性,則可以按約定創(chuàng)建陰影屬性。在這種情況下,將引入陰影外鍵屬性。影子外鍵屬性將命名<navigation property name><principal key property name>為(指向主體實(shí)體的依賴實(shí)體上的導(dǎo)航用于命名)。如果主體鍵屬性名稱包含導(dǎo)航屬性的名稱,則該名稱將只是<principal key property name>。如果依賴實(shí)體上沒(méi)有導(dǎo)航屬性,則會(huì)在其位置使用主體類型名稱。
例如,下面的代碼列表將導(dǎo)致BlogId Post向?qū)嶓w引入陰影屬性。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    //陰影屬性
    public List<Post> Posts { get; set; }
}
public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
     //陰影屬性
    public Blog Blog { get; set; }
}

5.2數(shù)據(jù)注釋

不能通過(guò)數(shù)據(jù)批注創(chuàng)建陰影屬性。

5.3Fluent API

你可以使用"熟知API"配置陰影屬性。一旦你調(diào)用了Property方法的字符串重載,就可以鏈接到其他屬性的任何配置調(diào)用。如果提供Property方法的名稱與現(xiàn)有屬性的名稱相匹配(一個(gè)陰影屬性或在實(shí)體類中定義的屬性),則代碼將配置該現(xiàn)有屬性,而不是引入新的陰影屬性。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            //創(chuàng)建陰影屬性
            .Property<DateTime>("LastUpdated");
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

讀到這里,這篇“ASP.NET Core中如何使用EF創(chuàng)建模型”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI