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

时间:2013-06-07 12:43:28

标签: c# entity-framework

我正在尝试了解实体框架的基础知识,我对Set<>有疑问DbContext上的方法。我正在使用数据库第一个模型来解决以下问题。

假设我有一个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);

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

3 个答案:

答案 0 :(得分:11)

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

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

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

dbSetProperty = Set<EntityType>();

但是,有些情况下,当你:

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

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

答案 1 :(得分:8)

我使用Set<T>的唯一原因是当你使用一种你不知道的类型时,例如通用插入。

来自my generic repository的示例:

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

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

答案 2 :(得分:2)

如果您查看生成的DbContext课程,您会发现AcitivityLogs只是DbSet<ActivityLog>

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