gpt4 book ai didi

RavenDB - 引用属性

转载 作者:行者123 更新时间:2023-12-02 16:48:49 25 4
gpt4 key购买 nike

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

让我们假设这个域模型:

人员具有姓名、地​​址和汽车属性。

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

使用 RavenDB,我可以创建一辆汽车并保存它。然后我可以创建一个人并将一辆汽车分配给该人的汽车属性。当我保存“人”时,“汽车”也会保存在“人”内。一切似乎都很好。

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

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

在RavenDB中,应该如何处理?从我读到的有关聚合/根对象的所有内容来看,似乎我应该向 Person 添加 CarId 属性。然后,当我加载Person时,也通过ID手动加载Car。是对的吗?或者我可以将 Car 属性嵌入到 Person 中,并以某种方式让所有 Person 对象在 Car.Mileage 随着时间的推移而变化时显示正确的 Person.Car.Mileage 吗?

最佳答案

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

这正是你告诉Raven 要做的。使用此文档模型,为了确保两个文档一致,您需要像您一样更新 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 - 引用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8717124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com