在我目前正在开发的一个应用程序中,我刚刚用RavenDB替换了db4o。我只是注意到一些不起作用的东西,做了一些研究,现在我需要一个理智的检查。
让我们假设这个域模型:
Person拥有姓名、地址和汽车属性。
Car具有Make、Model和Mileage属性。
使用RavenDB,我可以创建一辆汽车并保存它。然后,我可以创建一个Person并将一辆汽车分配给该Person的Car属性。当我救人的时候,车在人里面也被救了。看起来一切都很好。
问题出在我后来更新Car.Mileage的时候。Car在RavenDB中更新,但不在Person.Car中更新。Person.Car拥有老的里程数。
汽车是独立存在的。乔可以拥有这辆车,南希也可以。两个Person对象都有一个对Car的引用。
在RavenDB中,这应该如何处理?从我读到的关于聚合/根对象的所有内容来看,似乎我应该向Person添加一个CarId属性。那么我上人的时候,也是按ID手动上车的,对吗?或者,我是否可以将汽车属性嵌入Person中,并在Car.Mileage随时间变化时,以某种方式使所有Person对象显示正确的Person.Car.Mileage?
发布于 2012-09-07 07:50:36
如果我没理解错你的模型,你会生成2个这样的文档:
{// cars/1
"Make": "Honda",
"Model": "Civic",
"Mileage": 250000
}就像这样:
{// persons/1
"Name": "John Doe",
"Address": "...",
"Car": {
"Id": "cars/1",
"Make": "Honda",
"Model": "Civic",
"Mileage": 250000
}
}在这个文档模型中,这一点很重要。所有汽车属性都在Person.Car属性中被反规范化。所以在您的代码中,当您对Car.Mileage进行更新并保存它时。您最终得到的2个文档如下所示:
{// cars/1
"Make": "Honda",
"Model": "Civic",
"Mileage": 999999
}就像这样:
{// persons/1
"Name": "John Doe",
"Address": "...",
"Car": {
"Id": "cars/1",
"Make": "Honda",
"Model": "Civic",
"Mileage": 250000
}
}这正是你让瑞文做的。使用这个文档模型,为了确保两个文档是一致的,您需要像您一样更新Car对象和所有使用该汽车的人员的Person.Car.Mileage属性。
根据数据访问需求,您可以通过几种不同的方式修改模型。一种选择是让你的模型看起来像这样:
{// cars/1
"Make": "Honda",
"Model": "Civic",
"Mileage": 250000
}就像这样:
{// persons/1
"Name": "John Doe",
"Address": "...",
"Car": "cars/1"
}使用这个文档模型,您只需要更新Car.Mileage属性。如果选择此选项,还可以在单个网络请求中从Raven获取引用的文档。通过这样做:
var person = session.Include<Person>(x => x.Car).Load("persons/1");
var car = session.Load<Car>(person.Car);但是,在如何更改文档模型以满足应用程序需求方面,这只是一种选择。
https://stackoverflow.com/questions/8717124
复制相似问题