实体框架:何时使用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);
我的问题是这两种说法有什么不同?什么时候使用一个比另一个更合适?或者这只是个人喜好的问题?
差异无统计学意义。在第一种情况下,像这样:
class MyContext : DbContext
{
public DbSet<AcitivityLog> AcitivityLogs { get; set; }
}
当创建上下文时,它查找公共DbSet<T>
读/写属性,并执行以下操作(伪代码):
dbSetProperty = Set<EntityType>();
但是,在某些情况下,当你:
- 不想为所有实体类型设置公共属性;
- 不知道上下文设计时所有的实体类型。
在这些情况下,Set<T>
是获得适当实体集的唯一方法。
我使用Set<T>
的唯一原因是当你对一个你不知道的类型起作用时,例如一个泛型插入。
下面是我的通用存储库中的一个示例:
public void AddOnSave(T entity)
{
ctx.Set<T>.Add(entity);
}
将它用于常规内容只会使代码可读性降低IMHO
如果您查看生成的DbContext
类,您将看到AcitivityLogs
只是一个DbSet<ActivityLog>
。
所以它们是一样的。它只是DbSet的类型化定义