16

我正在尝试了解实体框架的基础知识,并且我对 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);

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

4

3 回答 3

13

没有显着差异。在第一种情况下,你有类似的东西:

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

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

dbSetProperty = Set<EntityType>();

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

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

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

于 2013-06-07T12:52:06.913 回答
11

我曾经使用过的唯一原因Set<T>是当您对不知道的类型(例如通用插入)进行操作时。

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

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

将它用于常规内容只会使代码的可读性降低恕我直言

于 2013-06-07T12:47:44.157 回答
3

如果您查看生成的DbContext类,您会发现它AcitivityLogs只是一个DbSet<ActivityLog>.

所以它们是同一个东西。这只是您的 DbSet 的类型化定义。

于 2013-06-07T12:46:39.327 回答