2014-02-26 72 views
0

假設你有以下對象:RavenDb多態性:無法加載子對象?

public abstract class Animal { 
    public Guid Id { get; set; } 
} 

public class Cat : Animal { 
    /* Stuff */ 
} 

public class Dog : Animal { 
    /* Stuff */ 
} 

我們儲存一些貓&犬進入RavenDb具有以下的ID:

貓/ 1367779b-20c7-466a-a660-46ae7e35c5bd

狗/ 23ef9796-9cdd-4323-88d2-5e5c37881352

如果我們試圖從商店這樣加載對象,我們有以下行爲:

var id = Guid.Parse("1367779b-20c7-466a-a660-46ae7e35c5bd"); 
Session.Load<Cat>(id) => returns correct Cat 
Session.Load<Animal>("Cats/"+id) => returns correct Cat as an animal 

Session.Load<Animal>(id) => returns null ??? 

我們確實想使用最後一行,但顯然這不起作用,因爲RavenDb中的前綴邏輯。我們已經找到一種方法來避免這種情況:使用而不是字符串一個GUID爲ID通過對象的構造器,如:

protected Animal(){ 
    this.Id = Guid.NewGuid().ToString(); 
} 

這消除了前綴「貓/」和「狗/」完全。有沒有更好的解決方案來解決這個問題,以便我們可以將Id保留爲Guid而不是字符串值?

回答

0

查看documentStore.Conventions.RegisterIdConvention對特定類的id生成有效控制。