想象一下,你有以下物品:
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而不是字符串值?
答案 0 :(得分:0)
查看documentStore.Conventions.RegisterIdConvention
以有效控制特定类的id生成。