2013-07-12 50 views
1

我在我的數據庫中有一個表格,我在其中放置了美國的國家(只是ID和州名稱)。實體框架MVC和來自數據庫的「靜態」對象

我想在控制器中獲取這些值 - 我是否應該執行標準操作:在EF中添加上下文,然後獲取對象?或者有另一種方式來獲得它?

我不想在這個表中做任何改變,所以db.XYZ.Add,db.XYZ.SaveChanges()等方法對我來說並不重要。

獲得諸如「州」之類的對象或例如「郵政編碼」基礎的最佳做法是什麼?

之後,第二個問題:拿什麼像這樣的代碼 「虛」:

[Table("Users")] 
public class User 
{ 
    (..) 
    public virtual string UserType { get; set; } 

商祺!

回答

2

實體框架允許獲得從數據庫對象,而不將它們添加到變更跟蹤:

using (var db = new MyContext()) 
{ 
    var states = db.States.AsNoTracking(); 
    ... 
} 

但是,當你在一個參考使用State對象,例如像:

var address = new Address() { State = state1 }; 
db.Addresses.Add(address); 
db.SaveChanges(); 

其中state1State對象,state1將終究被附加到上下文,並有EntityState.Added

所以你應該小心如何使用這些「未跟蹤」的對象。在這個例子中,你最好設定一個原始StateId屬性:

var address = new Address() { StateId = state1.Id }; 

(不重視state1)。

在這種情況下,您真正​​想要的是防止EF永遠更改對象的EntityState。我無法想到執行此操作。將是一個有趣的功能。


什麼手段這樣

virtual改性劑通常用於使導航屬性的遲緩裝載在碼「虛擬」。Address可能有

public virtual State State { get; set; } 

現在,當你抓住從數據庫中的地址,以後訪問其State屬性,狀態從在那一刻數據庫加載。這是因爲在EF的基礎上,EF創建了一個Address對象,該對象是Address類的派生對象,它已使用啓用延遲加載的代碼覆蓋State屬性。

但是,在顯示的代碼中,virtual對延遲加載沒有影響,因爲它是一個字符串屬性。所以它不能是一個導航屬性,它不允許延遲加載。

+0

謝謝!你能否在EF中向我展示更多關於'virtual'的文章?這個話題對我來說還不清楚。特別是「懶加載」 - 我不明白這一點。一些例子將對我非常有用:)關心! – whoah

+1

這個怎麼樣:http://msdn.microsoft.com/en-us/data/jj574232.aspx? –

+0

嗯一點點更容易理解,但仍不清楚。 EF如何知道'Eagerly Loading'哪些'Posts'必須加載到'Include'中?在「懶加載」中的同一個問題 - 據我所知,當我從數據庫中獲得例如'Blog'時,我也會自動獲得與這個博客相關的'Posts' - 我是對嗎?但是怎麼可能呢? EF如何知道哪些'Posts'與'virtual ICollection連接文章' – whoah

0

在代碼中,我首先使用枚舉來保存具有int id和說明的項目。

要做到這一點這樣,我添加以下內容:

在用戶添加:

... 

public int StateId { get; set; } 

public State State 
{ 
    get { return (State)StateId ; } 
} 
... 

創建一個枚舉:

public enum State 
{ 
    State1, 
    State2 
} 

枚舉ID保存回爲一個StateId我每次保存一個用戶到User