2010-01-25 81 views
2

顯然db4o網站最近重做了,現在舊的網址給404錯誤。每次我想我找到了答案,我都會收到404錯誤。db4o,Linq和UUID的

我有一個簡單的db4o數據庫,我已經設置來存儲人員。

public class Person 
{ 
    public string Firstname { get; set;} 
    public string Lastname {get;set;} 
} 

我已經能夠在數據庫上運行LINQ查詢,一切奇妙的作品。我在Web環境中進行編程,因此我需要有人從數據庫中識別並獲取唯一的對象,因此我只是簡單地將數據庫配置爲使用UUID。現在問題變成了,我怎麼才能從Linq查詢中得到的對象獲得UUID信息?

例如,假設我將所有人存儲在數據庫中,並且需要爲每個人生成唯一的URL。我將使用UUID來執行此操作。所以,我會運行此:

var people = (from Person p in db select p).ToList(); 

然後我就通過列表

foreach(Person person in people) 
{ 
    DoSomething(person); 
} 

最好的解決辦法可以使UUID在Person類的屬性重複,所以我可以只:

var uuid = person.UUID; 

但是我沒有看到這樣做的機制。我錯過了什麼嗎?

回答

5

我已經回答了這個問題here但與其他問題一起。因此我再次回答: 在db4o中,您通常沒有ID。 db4o使用object-identity區分對象。所以內存中的同一個對象將成爲數據庫的同一個對象。

只要你不序列化對象這工作正常,你不需要任何ID。然而,一旦對象被序列化/斷開連接,這就不再起作用(典型的網絡應用程序)。

我覺得這三個選項是可能的:

  • 使用db4o的internal id。你可以通過IObjectContainer.Ext().GetID(object)得到這個ID。當然,你可以通過ID獲得一個對象:IObjectContainer.Ext().GetByID(id)。但是,這個ID並不是永遠的。對數據庫進行碎片整理可更改此ID。
  • 使用db4o的UUIDs。但db4o UUID非常大
  • 自己創建ID。例如使用GUID。或者using a clever id-generator。請記住索引這樣一個ID字段,當你use it in queries

當然,您可以創建一個基類,該基類提供上述任何實現的id屬性。

+0

謝謝,但我想你錯過了這一點。我已經決定使用UUID了,但是很遺憾,在從Linq查詢中獲得對象後,找不到找到UUID的方法。我發現的文檔使用不同類型的查詢來獲取UUID。我用db.Ext()。GetObjectInfo(person).GetUUID(); 工作正常,但正如您所指出的那樣,UUID在這裏很實用。我想我將不得不咬咬子彈並實施hilo算法。 – Josh 2010-01-25 16:53:10

+0

對不起。是的,您可以通過'db.Ext()。GetObjectInfo(object).GetUUID()'獲取db4o-uuid,並通過'db.Ext()。GetByUUID()'獲取對象。它不依賴於查詢類型。 – Gamlor 2010-01-25 17:05:36

+0

是的,我應該更多地關注句子「例如使用GUID」。在你原來的帖子裏。 – Josh 2010-01-25 17:48:39

0

好的,這是我的原型快速,它似乎工作。首先,我爲所有數據對象創建了一個基類。現在,它只有一個int Id字段,儘管我可能也會將它用於其他一些事情。

然後我在IObjectContainer上創建了一個擴展方法。

public static class db4oExtensions 
{ 
    public static void StoreWithId(this Db4objects.Db4o.IObjectContainer db, DataObject dao) 
    { 
     int count = (from DataObject datao in db select datao.Id).Max(); 
     dao.Id = count + 1; 
     db.Store(dao); 
    } 
} 

所以現在當我在db中存儲一個對象時,我只需調用StoreWithId而不是Store。一些測試似乎表明這是行之有效的。現在我看到的一個問題是,如果我刪除具有最大值的對象,則會有兩個具有相同ID的對象,但這兩個對象不會同時存在。稍後我會找出答案,可能只需要在數據庫本身中存儲一個int增量器,這個增量器只能通過StoreWithId訪問。

+0

其實,我剛剛意識到使用.NET guid可能是更好的解決方案,首先轉換爲字符串以避免任何盒/拆箱問題。 – Josh 2010-01-25 17:38:23

+0

經過進一步的考慮,我已經看到了什麼是顯而易見的:與我的對象一起使用guid將避免所有這些麻煩開始。 – Josh 2010-01-25 17:47:48

+0

btw。由於db4o 7.12 Guids應該由db4o正確處理。沒有奇怪的拳擊/拆箱問題。 – Gamlor 2010-01-25 18:22:38