充血模型的EFCore实现

充血模型的五个需求

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

     public PhoneNumber PhoneNumber { get; private set;}
     public void ChangePassword(string password)
     {
         if (password.Length <= 3)
         {
             throw new ArgumentOutOfRangeException("密码长度需要大于3");
         }
         this.passwordHash = HashHelper.Hash_2_MD5_16(password, false);
    
     }
    

    实现

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

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

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

      public Guid Id { get; init; }
      public PhoneNumber PhoneNumber { get; private set; }
     //构造函数,在一开始创建对象时就被初始化
     public User(PhoneNumber phoneNumber)
     {
         this.Id = Guid.NewGuid();
         this.PhoneNumber = phoneNumber;
         this.UserAccessFail = new UserAccessFail(this);
     }
    

    实现

    定义有参数的构造方法。
    原理:EF Core中的实体类如果没有无参的构造方法,则有参的构造方法中的参数的名字必须和属性的名字一致。
    实现方式1:无参构造方法定义为private。
    实现方式2:实体类中不定义无参构造方法,只定义有意义的有参构造方法,但是要求构造方法中的参数的名字和属性的名字一致。

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

    private string? passwordHash;
    //这个成员变量不需要为外部得知,但是需要保存到数据库中
    

    实现

    不属于属性的成员变量映射为数据列。
    实现:
    builder.Property("成员变量名”)

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

    private string ID;
    //这个属性只能从数据库读出来,不能在数据库以外进行更改。
    //内部计算列
    

    实现

    从数据列中读取值的只读属性。
    EF Core中提供了“支持字段”(backing field)来支持这种写法:在配置实体类的代码中,使用HasField(“成员变量名”)来配置属性。

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

    内部使用的属性,不在数据库中生成对应的列
    

实现

有的属性不需要映射到数据列,仅在运行时被使用。
实现:使用lgnore()来配置忽略这个属性。

前三种比较常见,后两种并不常见。

posted @   想要来杯咖啡吗  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示