2015-09-25 37 views
0
public class Employee 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int DesignationID { get; set; } 

    **public virtual Designation Designation { get; set; }** 
} 

上下文類使用虛擬財產的模型類在MVC

public class DataClass : DbContext 
{ 
    public DbSet<Employee> Employee{ get; set; } 
    public DbSet<Designation> Designation { get; set; } 
} 

ViewModelClass

public class Class3 
{ 
    public Employee Employee{ get; set; } 
    public Designation Designation { get; set; } 
} 

查詢: -

(from emp in dc.Employee 
    join designation in dc.Designation 
     on emp.DesignationID equals designation.DesignationID 

    select new Class3 
    { 
     Employee = emp , 
     Designation = designation, 
    }).Single(); 

如果你看看員工的類屬性

public virtual Designation Designation { get; set; } 

此屬性是沒有用的,甚至當我刪除這個屬性,代碼工作

是我的做法是正確的?因爲互聯網上的每一個例子定義此屬性,但在我的情況下,它是沒有用的,我覺得這些都是投影的目的,但並不瞭解其作用機理

感謝

+0

'虛擬'用於實現一個屬性/變量,同時允許它被其子類覆蓋。如果沒有覆蓋,它確保有一些實現。希望有所幫助。 [MSDN page](https://msdn.microsoft.com/en-us/library/9fkccyh4.aspx) – DPac

+1

我在這裏沒有看到問題... – noobed

回答

2

如果你真的想使用自制任命爲你在你的例子所示,你可以安全地刪除Employee.Designation屬性來查詢數據。

通常虛擬屬性被實體框架用於相關對象的lazy loading(在第一次訪問涉及實體/實體的屬性時,從數據庫自動加載實體或實體集合的過程)。

所以使用懶加載查詢可以寫成

(from emp in dc.Employee 
    select new Class3 
    { 
     Employee = emp , 
     Designation = emp.Designation, 
    }).Single(); 

和的EntityFramework將使本身加入。

注意:在這種情況下,它看起來像你的Class3 viewmodel幾乎重複Employee模型,所以它看起來多餘。但我認爲這可能是一個同步的例子,而不是真實的例子。

+0

謝謝Andy科爾涅耶夫,它看起來那麼容易虛擬財​​產 –

+0

嘿安迪堅持在這裏有點問題 (從EMP在dc.Employee 選擇新員工 { 員工= EMP, 名稱= emp.Designation, })查詢。單(); 它給我的錯誤「Models.Employee不包含員工的定義」 就行員工= EMP, –

+0

對不起,我不知道該怎麼做編輯在評論 –

1

虛擬propperties主要用於由實體框架,並沒有在你的應用程序中使用(據我所知)。所以你可以安全地刪除它:)。

他們實際上做了什麼: 在運行時會爲您的虛擬屬性創建一個新類,並且實體框架將使用一個類,因爲它比使用常規類更快。

編輯 它被稱爲lazy loading

+0

謝謝Teun Vos,我現在明白了 –

1

模型中的虛擬屬性通常由ORM(例如Entity Framework/nHibernate)創建/用於延遲加載(它們只在訪問數據時才加載數據)。

如果是這種情況,我期望看到您的屬性的全部虛擬應用,他們不是。

在這種情況下,它似乎不需要是虛擬的,並且不清楚問題是否與屬性是虛擬的還是關於屬性的存在有關。

如果你還沒有使用Desgination屬性,你可以放心地將其刪除 - 免責聲明:如果您從取出應用程式的空檔,把它放回去快.... :)

如果該類自動創建,那麼它很可能與你的數據庫有關係。

在那裏的財產,你可以通過設置emp.Desgination完全消除您的class3

+0

謝謝freedomn-m,我現在明白了 –