RavenDb多态性:无法加载子对象?

时间:2014-02-26 15:54:11

标签: nosql polymorphism ravendb

想象一下,你有以下物品:

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

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

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

我们储存了一些猫和猫使用以下ID进入RavenDb:

猫/ 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();
}

这将完全删除前缀“Cats /”和“Dogs /”。有没有更好的解决方案来解决这个问题,以便我们可以将Id保持为Guid而不是字符串值?

1 个答案:

答案 0 :(得分:0)

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