这个问题可能看起来很傻, 但是在实体中定义“影子属性”有什么意义,因为相应的列将在数据库/表中创建? 另外,我们可以简单地通过继承来解决这个问题,所以想象一下 EF 没有引入“阴影属性”,然后呢?
有什么我不能用我手上的东西来实现的?
让我们看一些代码:
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime? DateOfBirth { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }
}
public class SchoolContext : DbContext
{
public SchoolContext() : base()
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().Property<DateTime>("CreatedDate");
modelBuilder.Entity<Student>().Property<DateTime>("UpdatedDate");
}
public DbSet<Student> Students { get; set; }
}
VS
public class BaseEntity
{
public DateTime CreatedDate
public DateTime UpdatedDate
}
public class Student : BaseEntity
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime? DateOfBirth { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }
}
这不会让实现变得更复杂吗?
实体中的“影子属性”概念用于对象关系映射 (ORM) 框架(如实体框架),以便在不修改数据库架构的情况下向实体添加其他属性。换句话说,这些属性没有映射到数据库表中的任何列,但可以用来存储不持久化的信息。
在您提供的第一个示例中,两个阴影属性:
"CreatedDate"
和"UpdatedDate"
他们被添加到“学生”实体使用
"modelBuilder.Entity<Student>().Property<DateTime>("PropertyName")"
方法。这些属性可用于跟踪学生记录的创建时间和最后更新时间,而无需将这些列添加到基础数据库表中。
在第二个示例中,
"BaseEntity"
类用于定义多个实体共享的公共属性。在这种情况下,"CreatedDate"
和"UpdatedDate"
属性定义在基类中,"Student"
类继承自"BaseEntity"
类。这种方法消除了为每个实体类定义这些属性的需要,并确保它们在所有实体中一致地实现。
我希望这有帮助:)
关键是实体类上不存在影子属性。相反,它们是在实体模型中定义的。您不通过类实例访问这些类型的属性。您使用
DbContext
模型管理器(与创建阴影属性的方式相同)。
private DateTime GetCreatedDate(Student student)
{
using dbContext = new MyDbContext();
var createdDate = (DateTime)dbContext
.Entry(student)
.Property("CreatedDate")
.CurrentValue;
}
由您决定是否要在实体类中使用与模型相关的元属性(例如外键 ID 和其他元数据等关系属性)。如果不这样做,您可以在模型中定义阴影属性。
在这种情况下,元数据是指有关实际数据记录的数据(表列)。 tTis 可以是时间戳、读/写计数器或数据关系相关数据,如外键。通常应用程序对此类元信息不感兴趣。您不想用元数据污染您的数据实体。