2012-05-31 24 views
0

我對這個實體框架Object Services Overview (Entity Framework)很新,所以如果我在這裏使用了錯誤的術語,請原諒我。從ObjectSet對象中存儲運行時數據<T>

我正在使用EDMX文件連接到SQLite數據庫。我想要做的是正常使用ObjectSet<T>,以便從數據庫的表中訪問一個對象集合。但是,我想另外在該集合中的對象中存儲一些運行時數據。在我的情況下,我有一組設備存儲在數據庫中,但在啓動時,我想將它們標記爲「已連接」或「已斷開連接」,並在整個執行過程中跟蹤此狀態。

由於EDMX生成的(行)類型是partial我已經添加了另一個部分定義,並在那裏添加了我的public bool Connected屬性。這似乎工作,我可以設置它,未來的查詢提供的對象具有我以前設置的相同的值。問題是,我不知道a)它是如何工作的,或者b)我能否信任它。這些疑惑來自這樣的事實:這些不是真的我們正在處理的對象的集合,對吧?

希望這是有道理的,否則我可以提供更多的細節。

回答

2

你在做什麼是完全安全的。

ObjectSet仍然是對象的集合。在下面添加了很多魔法。 我不是在內部的專家,但這裏是我認爲它的工作原理:

實體框架具有StateTracker帽子跟蹤你正在使用的實體。

EDMX模型中的每個班級都需要有鑰匙。 EF在內部使用該密鑰,以便它只將一次加載到內存中。

var foo = db.Foos.Single(x => x.Id == 1); // foo with Id 1 is unique (in memory) 
var foo2 = db.Foos.Single(x => x.Id == 1); // same instance of foo, but with updated values 
var foo3 = db.Foos.Single(x => x.Id == 2) // a new unique instance (Id = 2) 

bool sameObject = Object.Equals(foo, foo2); // will return true; 

在每次選擇發生以下情況:

是Foo類的實例已經跟蹤/它已經存在?

是 - >從數據庫更新現有實例的屬性。
否 - >創建Foo類的新實例(從數據庫獲取值)

當然,它只能更新映射的屬性。所以你在分部類中定義的那些不會被覆蓋。

如果您要先使用代碼。還有[NotMapped]屬性,它確保如果從代碼優先模型生成新數據庫時,該屬性不會包含在表中。

我希望我能爲你澄清一些事情。

+0

壯觀。這正是我正在尋找/希望聽到的信息。另外,感謝'[NotMapped]'屬性,我不知道存在! –