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>,获取正确的实体集是唯一的方法.
我曾经使用的唯一原因Set<T>是当你采用一种你不知道的类型时,例如通用插入.
下面是我的通用存储库中的一个示例:
public void AddOnSave(T entity)
{
ctx.Set<T>.Add(entity);
}
Run Code Online (Sandbox Code Playgroud)
使用它作为常规的东西只会使代码不太可读恕我直言