2013-07-10 171 views
2

在觀看一些實體框架的教程,我看到有創建兩個實體之間的關係很多方面。但我很難理解這些線的確切含義。實體框架中的映射?

public virtual Person person { set; get; } 

public virtual IEnumerable<Person> person { set; get; } 

public virtual ICollection<Person> person { set; get; } 

在他們解釋的影片之一,當你創建一個屬性,它是在同一時間虛擬和ICollection然後這使得延遲加載

什麼virtual關鍵字在這種情況下做的,會是什麼如果我們嘗試不使用虛擬關鍵字就會發生

回答

3

EF需要實現類作爲虛擬因爲這個代理服務器在運行時的一個繼承類創建。什麼延遲加載引擎做的是重新實現(覆蓋)在後臺這些屬性來達到預期效果。該virtual關鍵字不正是它:允許其他類重寫它的實現。這基本上就是爲什麼你需要這些屬性虛擬,如果你想延遲加載啓用和工作。

你會注意到,當延遲加載被啓用時,你在運行時得到的實體名稱很奇怪,像「Person_Proxy987321654697987465449」。

關於人際關係,只要您創建具有例如1一個實體:在數據庫中N的關係,你可以有一個集合,EF自動列出它的關係,所以你可以在你的代碼像這樣的例子中使用它,假設「人1:N訂單」:

var ordersFromSomePerson = person.Orders;

0

爲了回答關於爲什麼虛擬ICollection的使延遲加載在EF的問題,我們需要在該虛擬關鍵字的定義和含義C#。從MSDN

The virtual keyword is used to modify a method, property, indexer or event declaration, 
and allow it to be overridden in a derived class. For example, this method can be 
overridden by any class that inherits it. 

距離Object Oriented Programming概念的繼承機制的一部分。

它往往是的情況下,一個子類需要另一個(擴展)的功能的基類。在這種情況下,虛擬關鍵字允許程序員倍率(基類的用於該當前實施的默認實現如果需要的話,但所有其他預定義的方法/屬性/等仍從基類取!

一個簡單的例子是:

// base digit class 
public class Digit 
{ 
    public int N { get; set; } 
    // default output 
    public virtual string Print() 
    { 
     return string.Format("I am base digit: {0}", this.N); 
    } 
} 

public class One : Digit 
{ 
    public One() 
    { 
     this.N = 1; 
    } 
    // i want my own output 
    public override string Print() 
    { 
     return string.Format("{0}", this.N); 
    } 
} 

public class Two : Digit 
{ 
    public Two() 
    { 
     this.N = 2; 
    } 
    // i will use the default output! 
} 

當創建兩個對象和打印叫做:

var one = new One(); 
var two = new Two(); 
System.Console.WriteLine(one.Print()); 
System.Console.WriteLine(two.Print()); 

的輸出是:

1 
I am base digit: 2 

懶評價在EF中不是來自虛擬關鍵字直接,但是從覆蓋可能性關鍵字,可以(再次從MSDN上延遲加載):

When using POCO entity types, lazy loading is achieved by creating 
instances of derived proxy types and then overriding virtual 
properties to add the loading hook. 

當預定的方法進行重寫,那麼程序員可以使延遲加載!