2015-05-23 58 views
1

我正在尝试为使用MongoDb的非常特定的应用程序创建“某种”自定义“DbContext”。我面临一个问题:lambda表达式通用

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
当我打电话给我的DbSet财产的DbContext

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

的DbSet调用的DbContext,它在数据产生必要的操作每次。 我的问题是:DbSet如何获取对DbContext的引用。 我在问DbSet和DbContext之间的底层通信。

在此先感谢。 请原谅我的英语。
Ivan Talalaev

+1

它只是意味着'TEntity'必须是一个类 - 它约束了泛型参数 - 通常你使用这个接口,但是有一些特殊的值作为'new'(需要一个无参数的ctor,这样你就可以创建值... – Carsten

+0

Lambda表达式语法在C#6(Expression-Bodied方法)中是新的,http://geekswithblogs.net/BlackRabbitCoder/archive/2015/05/14/c.net-little-wonders “表达体力成员在C - 6.aspx –

回答

3

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

该方法声明有两个部分。第一是一个通用的类型约束:

where TEntity : class 

这意味着,在TEntity的地方使用任何类型的需要是reference type

第二部分是一个Expression-bodied function

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

哪个是C#6.0功能。如果您的方法是单线程的,则可以将其声明为,如的Lambda表达式。它只是意味着每次调用Set时,它都会调用该方法的一行“主体”。编译器会将它变成一个名为“幕后”的方法。

DbSet如何知道DbContext的存在?

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

+0

”它只是意味着每次你打电话给Set。“和..? –

+0

@YairNevet不知道发生了什么。固定。 –

+0

@YuvalItzchakov谢谢你的回答。你有关于DbContext的想法吗? –

0

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

反过来DbContext一些如何(可能通过反射)设置引用_context在cunstructor调用时DbSet类型的所有封装字段。