DDD之EFCore操作实体属性和实现充血模型
1. DDD之EFCore操作实体属性和实现充血模型
1.1 EFCore操作实体属性
(1)对象操作实体属性会调用get,set方法
(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,然后通过构造方法为这些属性赋予初始值。
(2)定义有参数的构造方法。
实现:
- 无参构造方法定义为private。
- 实体类中不定义无参构造方法,只定义有意义的有参构造方法,但是要求构造方法中的参数的名字和属性的名字一致。
(3)有的成员变量没有对应属性,但是这些成员变量需要映射为数据表中的列,也就是我们需要把私有成员变量映射到数据表中的列。
实现:
builder.Property("成员变量名")
(4)有的属性只读的,也就是它的值是从数据库中读取出来的,但是我们不能修改属性值。
在配置实体类的代码中,使用HasField(“成员变量名”)来配置属性。
(5)有的属性不需要映射到数据列,仅在运行时被使用。
使用Ignore()来配置忽略这个属性。
(6)查看数据库
执行命令add-mirgration 、update-database