【发布时间】:2018-11-26 02:21:34
【问题描述】:
鉴于这种情况:
public class FooContext : DbContext
{
public FooContext(DbContextOptions<FooContext> opts) : base(opts)
{ }
public DbSet<Bar> Bars { get; set; }
}
我可以通过两种方式联系Bar:
fooContext.Bars.Add(new Bar()); // Approach 1
或
fooContext.Set<Bar>().Add(new Bar()); // Approach 2
这两种方法有什么区别?
我尝试通过以下方式回答我自己的问题:
- 检查两者的智能感知(只告诉我
Set<T>()也创建了DbSet<T>) - Googling for "EF Core Set vs property" 但这似乎不是“正确”的查询
-
Google for
DbSet<T>specifically on the docs urls 但这里似乎也没有相关结果 - 阅读the
DbSet<T>docs 的介绍,这只是表明您可以通过这两种方法中的任何一种来获得一套(不是有或没有区别) - 阅读没有相关信息的the
Set<T>()docs
但是我找不到任何好的解释来说明两者中的哪一个用于哪个目的。有什么区别?或者更重要的是:我应该在哪里以及如何在文档中找到它?
【问题讨论】:
-
他们似乎在做同样的事情:github.com/aspnet/EntityFrameworkCore/blob/master/src/EFCore/… 第 245 行。我认为不同之处在于
Set<Bar>将使用 IDbSetSource 在运行时查找类型并计算出它需要什么表,而 @ 987654336@ 属性在编译时执行此操作。 -
@Ben Ahh 当然可以。几年后,我仍然需要偶尔提醒一下,微软在这个领域几乎开源了任何东西。谢谢!
-
有没有人在具有大量映射实体的上下文中使用 DbSet
属性与 Set () 方法进行性能测试?我正在一个包含大约 200 个实体的应用程序中工作。 DbContext 可以为所有实体提供 200 个属性,或者 Set 方法可以用于特定位置所需的各个实体。我很好奇使用这么多 DbSet 属性启动上下文的工作是否可能比仅根据需要使用 Set 方法要慢。应用程序将使用 DI 在 MVC 应用程序中注入 DbContext,因此将为每个请求创建一个新对象。