通用lambda表达式

时间:2015-05-23 07:20:34

标签: c# entity-framework generics lambda dbcontext

我试图创造某种"某种"自定义" DbContext"对于使用MongoDb的非常具体的应用程序。我遇到了一个问题:

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);

在这个表达式中我无法理解lambda表达式在&#34;其中&#34;条款。有人可以启发我吗?

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之间的底层通信。

提前致谢。 请原谅我的英文。
伊万塔拉耶夫

2 个答案:

答案 0 :(得分:3)

  

我无法理解lambda表达式在&#34;其中&#34;子句。

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

where TEntity : class

这意味着TEntity所使用的任何类型都必须是reference type

第二部分是Expression-bodied function

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

哪个是C#6.0功能。如果您的方法是单行,则可以将声明为 Lambda Expression。它只是意味着每次调用Set时,它都会调用一行&#34; body&#34;方法。编译器会把它变成一个命名的方法&#34;在幕后&#34;。

  

DbSet如何知道DbContext的存在?

它不直接知道它DbContext表示您的数据库,DbSet表示该数据库中的表。当您操纵DbSet时,它会隐含地引用它的基础DbContext并通过上下文添加它的实体。

答案 1 :(得分:0)

我找到了我最后一部分问题的答案。 根据{{​​3}}和this EntityFramework 6(不确定this
DbSet将引用_context保留到DbContext并使用它来添加或删除实体。

反过来,DbContext中的一些方法(可能是通过反射)在cunstructor调用时设置引用{D}类型的所有封装字段中的_context