2013-03-04 85 views
3

在订单和订单行的经典案例中,每个订单行都有对其父订单的引用。当我将OrderLine保存到RavenDB时,它将整个Order记录的副本保存为每个OrderLine的属性。我如何才能将它仅保存到订单的链接?就像这样:存储对父文档的引用,而不是存储文档的副本

{ 
...other orderline properties... 
Order : "orders/123" 
} 

,而不是这个

 { 
     ...other orderline properties... 
     Order : { 
    ...all properties for order 123... 
     } 
} 

回答

3

欢迎非关系数据库!订单行不会获得ID。他们不会把自己的文件放进去。它们存储在重要的地方 - 与订单!

public class OrderLine 
{ 
    public string Product { get; set; } 
    public int Quantity { get; set; } 
    public decimal Price { get; set; } 
} 

public class Order 
{ 
    public string Id { get; set; } 
    public string CustomerId { get; set; } 
    public List<OrderLine> Lines { get; set; } 
    public decimal Total { get; set; } 
} 

生产同类文件:

orders/123 
{ 
    "CustomerId": "customers/456", 
    "Lines": [ 
     { "Product": "Foo", "Quantity": 2, "Price": 10.00 }, 
     { "Product": "Bar", "Quantity": 3, "Price": 20.00 }, 
     { "Product": "Baz", "Quantity": 4, "Price": 30.00 } 
    ] 
    "Total": 200.00 
} 

更多见the documentation

+0

确实马特,但即使在您提到的链接中,OrderLine部分也会存储对其产品的引用,而不是存储该产品所有属性的副本。当我的OrderLine类具有产品类型的产品属性时,我该如何实现?我是否必须将我的OrderLine类更改为具有类型为string的ProductID属性? – 2013-03-05 02:24:56

+0

考虑您希望订单行中的产品信息与订单时的完全相同。如果产品更改或被删除,则不应影响过去的订单或订单项次。因此,您应该将所需产品的字段复制到订单行中。您可能需要一个'ProductId'作为参考,但您应该将产品说明和价格单独归一化到订单行中。你可以为此创建一个容器类(例如'ProductRef'),或者你可以单独存储这些字段。 – 2013-03-05 02:44:29

+0

另外,阅读[this](http://ravendb.net/docs/client-api/querying/handling-document-relationships) – 2013-03-05 02:45:46