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

Ser*_*uss 13 c# entity-framework

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

假设我有一个ActivityLog数据库,其中包括我可以用来提取消息(例如NLog消息).我可以编写一些代码来提取所有这样的消息:

using (var entities = new ActivityLogEntities())
    foreach (var log in entities.AcitivityLogs)
        Console.WriteLine(log.Message);
Run Code Online (Sandbox Code Playgroud)

但是我也可以做到这一点:

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

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

Den*_*nis 11

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

class MyContext : DbContext
{
    public DbSet<AcitivityLog> AcitivityLogs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

dbSetProperty = Set<EntityType>();
Run Code Online (Sandbox Code Playgroud)

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

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

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


Not*_*ple 8

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

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

  public void AddOnSave(T entity)
  {
     ctx.Set<T>.Add(entity);
  }
Run Code Online (Sandbox Code Playgroud)

使用它作为常规的东西只会使代码不太可读恕我直言