充血模型的五个需求
-
属性是只读的或者只能被类内部的代码修改。
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,然后通过构造方法为这些属性赋予初始值。
-
定义有参数的构造方法。
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:实体类中不定义无参构造方法,只定义有意义的有参构造方法,但是要求构造方法中的参数的名字和属性的名字一致。 -
有的成员变量没有对应的属性,但是这些成员变量需要映射为数据表中的列,也就是我们需要把私有的成员变量映射到数据表中的列。
private string? passwordHash; //这个成员变量不需要为外部得知,但是需要保存到数据库中
实现
不属于属性的成员变量映射为数据列。
实现:
builder.Property("成员变量名”) -
有的属性是只读的,也就是它的值是从数据库中读取出来的,但是我们不能修改属性的值。
private string ID; //这个属性只能从数据库读出来,不能在数据库以外进行更改。 //内部计算列
实现
从数据列中读取值的只读属性。
EF Core中提供了“支持字段”(backing field)来支持这种写法:在配置实体类的代码中,使用HasField(“成员变量名”)来配置属性。 -
有的属性不需要映射到数据列,仅在运行时被使用。
内部使用的属性,不在数据库中生成对应的列
实现
有的属性不需要映射到数据列,仅在运行时被使用。
实现:使用lgnore()来配置忽略这个属性。
前三种比较常见,后两种并不常见。
标签:构造方法,实现,模型,充血,private,PhoneNumber,EFCore,public,属性 From: https://www.cnblogs.com/guan-tou6/p/18334240