Net6 EfCore 值對象類型和從屬實體類型

十年河東,十年河西,莫欺少年窮

學無止境,精益求精

想申請微軟MVP,無奈只有博客園有貢獻,今天加了一個現任的微軟MVP,據他所說,目前微軟MVP申請比以前嚴格,僅僅博客園分享微軟知識是不夠的,還得有過社區分享,視頻製作,出書等,看樣子,我的微軟MVP夢是越來越遠了。

1、值對象類型

在實際項目開發中,我們可能碰到諸如狀態、類型等字段,在大多數設計時,一般都是設計成 int 類型,例如:訂單狀態 0:待支付 1:已支付 2:已取消

這樣的設計不影響程序的執行,但代碼的可讀性比較差

在efcore中我們可以藉助枚舉來完成

    public class  GoodsOrder
    {
        public string orderId { get; set; } 
        public orderStatusEnum orderStatus { get; set; } 
    }

    public enum orderStatusEnum
    {
        待支付,已支付,已取消
    }

配置如下:

  public void Configure(EntityTypeBuilder<GoodsOrder> builder)
        {
            builder.ToTable("GoodsOrders");
            builder.HasKey(A => A.orderId);
            builder.Property(A => A.orderStatus).HasComment("訂單狀態 0:待支付 1:已支付  2:已取消"); 
        }

這樣,在數據庫中存儲時是以整數類型進行存儲的,如果想在數據庫中直接存儲中文:待支付、已支付、已取消,你可以這樣修改配置

  builder.Property(A => A.orderStatus).HasMaxLength(10).IsUnicode(true).HasConversion<string>().HasComment("訂單狀態 0:待支付 1:已支付  2:已取消");

HasConversion<string> 意思是指將枚舉存儲爲字符串  

IsUnicode 是指存儲中文或日文等Unicode字符集

2、從屬實體類型

EF Core 使你能夠對只能出現在其他實體類型的導航屬性上的實體類型進行建模。 它們稱爲“從屬實體類型”。 包含從屬實體類型的實體是其所有者。

從屬實體本質上是所有者的一部分,沒有它就不能存在,它們在概念上類似於聚合。 這意味着,根據定義,從屬實體位於與所有者關係的從屬關係中。

    public class shop
    {
        public long id { get; set; }
        public string shopName { get; set; }
        public Geo  Geo { get; set; }
    }

    public class Geo
    {
        public double lat { get; set; }
        public double lgt { get; set; }
    }

配置如下

    internal class shopConfig : IEntityTypeConfiguration<shop>
    {
        public void Configure(EntityTypeBuilder<shop> builder)
        {
            builder.ToTable("shops");
            builder.OwnsOne(A => A.Geo, B =>
            {
                B.Property(p => p.lat).HasColumnName("lat").HasComment("緯度");
                B.Property(p => p.lgt).HasColumnName("lgt").HasComment("經度");
            }); 

        }
    }

示例2

支持中英文的設計模式

    public class blog
    {
        public long id { get; set; }
        public MultiLangString title { get; set; }
        public MultiLangString body { get; set; }
    }

    public record MultiLangString(string Chinese ,string English);

    internal class blogConfig : IEntityTypeConfiguration<blog>
    {
        public void Configure(EntityTypeBuilder<blog> builder)
        {
            builder.ToTable("blogs");
            builder.OwnsOne(A => A.title, B =>
            {
                B.Property(p => p.Chinese).HasColumnName("ChineseTitle").IsUnicode(true).HasMaxLength(150).HasComment("中文標題");
                B.Property(p => p.English).HasColumnName("EnglishTitle").IsUnicode(false).HasMaxLength(150).HasColumnType("varchar(150)").HasComment("英文標題");
            }); 
            builder.OwnsOne(A => A.body, B =>
            {
                B.Property(p => p.Chinese).HasColumnName("ChineseBody").IsUnicode(true).HasMaxLength(150).HasComment("中文內容");
                B.Property(p => p.English).HasColumnName("EnglishBody").IsUnicode(false).HasColumnType("varchar(150)").HasComment("英文內容");
            }); 
        }
    }

從屬實體類型詳細參考:https://learn.microsoft.com/zh-cn/ef/core/modeling/owned-entities

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章