2010-07-02 28 views
13

Tôi đang cố gắng di chuyển một ứng dụng web hiện có để sử dụng RavenDB.RavenDB: Id thế hệ cho các tài liệu phụ

Tôi hiện có các trang trong ứng dụng web của mình cho phép bạn xem Danh mục, Tiểu thể loại và Tài nguyên dựa trên một id trong chuỗi truy vấn.

Tuy nhiên tôi nhận thấy rằng RavenDB tạo id cho rễ tổng hợp, nhưng không phải cho các thực thể con.

Tôi không nghĩ rằng danh mục phụ là một gốc tổng hợp (một Danh mục có các Danh mục con), vì vậy, làm cho nó trở thành một tài liệu phụ của tài liệu Danh mục của tôi.

Tôi có sai khi biến nó thành tài liệu phụ khi tôi truy cập trực tiếp bằng id của nó được chuyển vào chuỗi truy vấn không? Nhưng nếu không, làm thế nào tôi nên truy cập các SubCategories riêng lẻ vì RavenDB dường như không tạo ra các id cho các thực thể không phải là các gốc tổng hợp?

Trả lời

15

Có một số long but interesting discussion trên danh sách gửi thư Raven về tình huống chính xác này.

Câu trả lời ngắn gọn là Raven không được thiết kế để thực hiện việc này, chỉ các thực thể gốc mới có id, mọi thứ khác được coi là một loại giá trị. Nhưng bạn có thể tự mình thực hiện, xem mẫu mã ở cuối luồng để biết thông tin.

+0

Cảm ơn Matt. Điều đó mô tả chính xác tình hình của tôi. Tôi sẽ bỏ phiếu cho câu trả lời của bạn sau khi tôi có đủ danh tiếng. – Andy

7

Tôi đã gặp sự cố này nhưng không thoải mái khi cho phép tài liệu tạo ID vì tôi không cảm thấy đó là chủ đề an toàn, đặc biệt đối với môi trường dựa trên web.

Cuối cùng tôi quyết định để cho các máy chủ tạo ra id cho tôi sử dụng một phương pháp GenerateDocumentKey như vậy:

using (var session = Store.OpenSession()) 
{ 
    if(category.SubCategories != null) 
    { 
     var newSubCategories = data.BankAccounts.Where(x => string.IsNullOrEmpty(x.Id)); 
     foreach (var sc in newSubCategories) 
      sc.Id = session.Advanced.Conventions.GenerateDocumentKey(sc);  
    } 

    session.Store(data); 
    session.SaveChanges(); 
} 

Bằng cách này tôi đang cho phép các cơ sở dữ liệu để tạo ra con Id và có thể đảm bảo rằng tôi đã thắng 't phải phục vụ cho điều kiện chủng tộc vv trong lớp thực tế chính nó.

+2

Lưu ý rằng đây là 'Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey (sc) ' –

Các vấn đề liên quan