DDD之EFCore操作实体属性和实现充血模型

1. DDD之EFCore操作实体属性和实现充血模型

1.1 EFCore操作实体属性

(1)对象操作实体属性会调用get,set方法

image-20220318211612469

(2)基于性能和对特殊功能支持的考虑,EF Core在读写属性的时候,如果可能,它会直接跳过get、set,而直接操作真正存储属性值的成员变量

(3)EF Core在读写实体对象的属性时,会查找属性对应的成员变量,如果能找到,EF Core会直接读写这个成员变量的值,而不是通过set和get代码块来读写。

(4)EF Core会尝试按照命名规则去直接读写属性对应的成员变量,只有无法根据命名规则找到对应成员变量的时候,EF Core才会通过属性的get、set代码块来读写属性值。可以在FluentAPI中通过UsePropertyAccessMode()方法来修改默认的这个行为。

1.2 EFCore实现充血模型

User

public class User
{
    //属性是只读的或者只能被内部的代码修改。
    //把属性的set定义为private或者init,然后通过构造方法为这些属性赋予初始值。
    public int Id { get; init; }

    public DateTime CreatedDateTime { get; init; }

    public string UserName { get; private set; }

    public int Credit { get; private set; }

    //把私有成员变量映射到数据表中的列。
    //builder.Property("成员变量名")
    private string? passwordHash;

    //有的属性只读的,也就是它的值是从数据库中读取出来的,但是我们不能修改属性值。
    //在配置实体类的代码中,使用HasField(“成员变量名”)来配置属性
    private string? remark;
    public string? Remark 
    {
        get { return remark; }
    }

    //有的属性不需要映射到数据列,仅在运行时被使用。
    //Ignore()来配置忽略这个属性。
    public string? Tag { get; set; }



    //造方法中的参数的名字和属性的名字一致。

    public User(string userName, DateTime createdDateTime, int credit)
    {
        this.UserName = userName;
        this.CreatedDateTime = createdDateTime;
        this.Credit = credit;
    }

    //无参构造方法定义为private。
    //EFCore使用
    /*
    private User() { }


    //如果构造函数和属性名称不匹配
    public User(string un, DateTime time, int c)
    {
        this.UserName = un;
        this.CreatedDateTime = time;
        this.Credit = c;
    }
    */

}

UserConfig

public class UserConfig : IEntityTypeConfiguration<User>
{
    public void Configure(EntityTypeBuilder<User> builder)
    {
        builder.ToTable("T_Users");
        builder.Property(u => u.UserName).IsRequired().HasMaxLength(50);
        //builder.Property把私有成员变量映射到数据表中的列。
        builder.Property("passwordHash").IsRequired().HasMaxLength(100);
        //属性是只读的,也就是它的值是从数据库中读取出来的,但是我们不能修改属性值。
        //使用HasField(“成员变量名”)来配置属性
        builder.Property(u => u.Remark).HasField("remark").HasMaxLength(100); ;
        //builder.Ignore有的属性不需要映射到数据列,仅在运行时被使用。
        builder.Ignore(u => u.Tag);//特征五
    }
}

(1)属性是只读的或者只能被内部的代码修改。

实现:把属性的set定义为private或者init,然后通过构造方法为这些属性赋予初始值。

image-20220319144529869

(2)定义有参数的构造方法。

实现:

  • 无参构造方法定义为private。

image-20220319144554151

  • 实体类中不定义无参构造方法,只定义有意义的有参构造方法,但是要求构造方法中的参数的名字和属性的名字一致。

image-20220319144705469

(3)有的成员变量没有对应属性,但是这些成员变量需要映射为数据表中的列,也就是我们需要把私有成员变量映射到数据表中的列。

实现:

builder.Property("成员变量名")

image-20220319144724926

(4)有的属性只读的,也就是它的值是从数据库中读取出来的,但是我们不能修改属性值。

在配置实体类的代码中,使用HasField(“成员变量名”)来配置属性。

image-20220319144746142

(5)有的属性不需要映射到数据列,仅在运行时被使用。

使用Ignore()来配置忽略这个属性。

image-20220319144916879

(6)查看数据库

执行命令add-mirgration 、update-database

image-20220319145027362

posted @ 2022-04-08 17:17  peng_boke  阅读(721)  评论(0编辑  收藏  举报