在实体中定义“影子属性”有什么意义?

问题描述 投票:0回答:2

这个问题可能看起来很傻, 但是在实体中定义“影子属性”有什么意义,因为相应的列将在数据库/表中创建? 另外,我们可以简单地通过继承来解决这个问题,所以想象一下 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; }
}

这不会让实现变得更复杂吗?

c# .net entity-framework clr
2个回答
0
投票

实体中的“影子属性”概念用于对象关系映射 (ORM) 框架(如实体框架),以便在不修改数据库架构的情况下向实体添加其他属性。换句话说,这些属性没有映射到数据库表中的任何列,但可以用来存储不持久化的信息。

在您提供的第一个示例中,两个阴影属性:

"CreatedDate"
"UpdatedDate"

他们被添加到“学生”实体使用

"modelBuilder.Entity<Student>().Property<DateTime>("PropertyName")"
方法。这些属性可用于跟踪学生记录的创建时间和最后更新时间,而无需将这些列添加到基础数据库表中。

在第二个示例中,

"BaseEntity"
类用于定义多个实体共享的公共属性。在这种情况下,
"CreatedDate"
"UpdatedDate"
属性定义在基类中,
"Student"
类继承自
"BaseEntity"
类。这种方法消除了为每个实体类定义这些属性的需要,并确保它们在所有实体中一致地实现。

我希望这有帮助:)


0
投票

关键是实体类上不存在影子属性。相反,它们是在实体模型中定义的。您不通过类实例访问这些类型的属性。您使用

DbContext
模型管理器(与创建阴影属性的方式相同)。

private DateTime GetCreatedDate(Student student)
{
  using dbContext = new MyDbContext();
  var createdDate = (DateTime)dbContext
    .Entry(student)
    .Property("CreatedDate")
    .CurrentValue; 
}

由您决定是否要在实体类中使用与模型相关的元属性(例如外键 ID 和其他元数据等关系属性)。如果不这样做,您可以在模型中定义阴影属性。
在这种情况下,元数据是指有关实际数据记录的数据(表列)。 tTis 可以是时间戳、读/写计数器或数据关系相关数据,如外键。通常应用程序对此类元信息不感兴趣。您不想用元数据污染您的数据实体。

阴影和索引器属性

© www.soinside.com 2019 - 2024. All rights reserved.