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

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