2015-05-23 85 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類型的所有封裝字段。