我正在尝试了解实体框架的基础知识,我对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);
我的问题是这两个陈述有什么区别?什么时候使用一个比另一个更合适?或者这只是个人偏好的问题?
答案 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的类型定义。