【问题标题】:RavenDB - Referencing PropertiesRavenDB - 引用属性
【发布时间】:2012-01-03 18:47:49
【问题描述】:

在我目前正在使用的应用程序中,我刚刚将 db4o 替换为 RavenDB。我只是注意到有些东西不起作用,做了一些研究,现在我需要进行健全性检查。

让我们假设这个领域模型:

Person 具有 Name、Address 和 Car 属性。

汽车具有品牌、型号和里程属性。

使用 RavenDB,我可以创建汽车并保存它。然后我可以创建一个 Person 并将 Car 分配给 Person 的 Car 属性。当我保存 Person 时,Car 会保存在 Person 中。一切似乎都很好。

问题是当我稍后更新 Car.Mileage 时。 Car 在 RavenDB 中更新,但不在 Person.Car 中。 Person.Car 有旧里程。

汽车是独立存在的。人乔可以拥有这辆车,人南希也可以。两个 Person 对象都会引用 Car。

在 RavenDB 中,这应该如何处理?从我读过的关于聚合/根对象的所有内容来看,看起来我应该为 Person 添加一个 CarId 属性。然后,当我加载 Person 时,还要通过 ID 手动加载 Car。那正确吗?或者我可以在 Person 中嵌入 Car 属性,并以某种方式让所有 Person 对象显示正确的 Person.Car.Mileage,因为 Car.Mileage 会随时间而变化?

【问题讨论】:

  • 鲍勃,我会就此写一篇文章,因为这似乎是一个常见问题。
  • 谢谢,丹尼尔。是否可以对整体方法发表评论?我需要在明天之前完成这项工作。我今天总是可以用一种方式编码,以后再改变,但如果我第一次能正确地做到这一点......
  • 等几分钟... :)
  • 请看下面我的回答,再等几分钟...

标签: ravendb


【解决方案1】:

如果我正确理解了您的模型,您将生成 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);

但这只是您如何更改文档模型以满足应用程序需求的一种选择。

【讨论】:

  • 感谢您的回答。我认为 RavenDB 社区不赞成您的第二种方法。虽然这仍然是我这样做的方式。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多