【问题标题】:Generic with lambda expression带有 lambda 表达式的泛型
【发布时间】:2015-05-23 07:20:33
【问题描述】:

我正在尝试为使用 MongoDb 的非常特定的应用程序创建“某种”自定义“DbContext”。我遇到了一个问题:

DbSet 是如何知道 DbContext 存在的?

我的意思是,当我写作时

public DbSet<Assignment> Assignments { get; set; }
public DbSet<User> Users { get; set; }

在我的 DbContext 中,DbSet 实例如何获取对 DbContext 类的引用?通过反射?

但是当我深入研究EntityFramework source code 时,我遇到了另一个问题

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class => _setInitializer.Value.CreateSet<TEntity>(this);

在这个表达式中,我无法理解“where”子句中的 lambda 表达式是什么。有人可以启发我吗?

UPD
每次我在 DbContext 中调用我的 DbSet 属性时

public class BlogPostContextContext : DbContext
{
   public DbSet<Blog> Blogs { get; set; }
   public DbSet<Post> Posts { get; set; }
}

DbSet 调用 DbContext 并对数据进行必要的操作。 我的问题是:DbSet 如何获取对 DbContext 的引用。 我在询问 DbSet 和 DbContext 之间的底层通信。

提前致谢。 对不起,我的英语。
伊万·塔拉拉耶夫

【问题讨论】:

  • 这只是意味着 TEntity 必须是一个类 - 它限制了泛型参数 - 通常你将它与接口一起使用,但有一些特殊值如 new (需要一个无参数的 ctor 所以您可以创建泛型类型的值),...
  • Lambda 表达式语法是 C# 6(表达式体方法)中的新语法,geekswithblogs.net/BlackRabbitCoder/archive/2015/05/14/…

标签: c# entity-framework generics lambda dbcontext


【解决方案1】:

我不明白“where”子句中的 lambda 表达式是什么。

方法声明有两部分。第一个是泛型​​类型约束:

where TEntity : class

这意味着任何用于代替TEntity 的类型都必须是reference type

第二部分是Expression-bodied function

=> _setInitializer.Value.CreateSet<TEntity>(this);

这是 C# 6.0 的一项功能。如果你的方法是单行的,它可以被声明为 like 一个 Lambda 表达式。它只是意味着每次调用Set 时,它都会调用该方法的一行“主体”。编译器会将其转换为“幕后”的命名方法。

DbSet 是如何知道 DbContext 存在的?

它不知道它直接DbContext 代表您的数据库,DbSet 代表该数据库中的一个表。当您操作 DbSet 时,它会隐式保存对其底层 DbContext 的引用,并通过上下文添加它的实体。

【讨论】:

  • "简单来说就是每次调用Set。"还有..?
  • @YairNevet 不确定发生了什么。固定。
  • @YuvalItzchakov 非常感谢您的回答。你对 DbContext 有什么想法吗?
  • @User 我不确定我是否理解有关DbContext 的问题。你能详细说明一下吗?我的意思是,你继承自 DbContext,不是吗?
  • @YuvalItzchakov 是的,我继承自 DbContext,但我的问题是关于 DbSet 和 DbContext 之间的通信。我已经更新了我的问题,请您看一下。
【解决方案2】:

我找到了我最后一部分问题的答案。 根据thisthis EntityFramework 6(不确定new EF7
DbSet 保持对 DbContext 的引用 _context 并使用它来添加或删除实体。

在调用 cunstructor 时,DbContext 又如何(可能通过反射)在其所有 DbSet 类型的封装字段中设置引用 _context

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多