实体框架:何时使用Set<>

本文关键字:Set 何时使 框架 实体 | 更新日期: 2023-09-27 18:17:19

我试图了解实体框架的基础知识,我有一个关于DbContext上的Set<>方法的问题。对于以下问题,我使用数据库优先模型。

假设我有一个ActivityLog数据库,在其他事情中,我可以使用它来提取消息(例如NLog消息)。我可以写一些代码来取出所有的消息,像这样:

using (var entities = new ActivityLogEntities())
    foreach (var log in entities.AcitivityLogs)
        Console.WriteLine(log.Message);

然而,我也可以实现同样的事情,这样做:

using (var entities = new ActivityLogEntities())
    foreach (var message in entities.Set<ActivityLog>().Select(entity => entity.Message))
        Console.WriteLine(message);

我的问题是这两种说法有什么不同?什么时候使用一个比另一个更合适?或者这只是个人喜好的问题?

实体框架:何时使用Set<>

差异无统计学意义。在第一种情况下,像这样:

class MyContext : DbContext
{
    public DbSet<AcitivityLog> AcitivityLogs { get; set; }
}

当创建上下文时,它查找公共DbSet<T>读/写属性,并执行以下操作(伪代码):

dbSetProperty = Set<EntityType>();

但是,在某些情况下,当你:

  1. 不想为所有实体类型设置公共属性;
  2. 不知道上下文设计时所有的实体类型。

在这些情况下,Set<T>是获得适当实体集的唯一方法。

我使用Set<T>的唯一原因是当你对一个你不知道的类型起作用时,例如一个泛型插入。

下面是我的通用存储库中的一个示例:

  public void AddOnSave(T entity)
  {
     ctx.Set<T>.Add(entity);
  }

将它用于常规内容只会使代码可读性降低IMHO

如果您查看生成的DbContext类,您将看到AcitivityLogs只是一个DbSet<ActivityLog>

所以它们是一样的。它只是DbSet的类型化定义