2012-02-07 30 views
7

Tôi đang sử dụng RavenDb được nhúng. Là một phần của các bài kiểm tra tích hợp của tôi, tôi muốn kiểm tra các đối tượng được tiếp tục tồn tại. Khi tôi SaveChanges trên một đối tượng, sau đó lấy nó, nó không thể được tìm thấy trừ khi tôi vứt bỏ kết nối của tôi.RavenDB làm thế nào để tuôn ra?

này không làm việc cho tôi, như không có tập tin được trả về

using (var session = _dataDocumentStore.Instance.OpenSession()) 
{ 
     session.Store(file); 
     session.SaveChanges(); 
} 

....

using (var session = _dataDocumentStore.Instance.OpenSession()) 
{ 
      return session.Query<File>().ToList(); 
} 

Tôi tạo ra một phương pháp Flush mà disposes và tái tạo lại một EmbeddableDocumentStore mà làm việc, nhưng như đây là điều gì đó cảm thấy cơ bản tôi có thể đi về những điều sai đường:

public static IDocumentStore Initialize() 
     { 
      instance = new EmbeddableDocumentStore 
      { 
       DataDirectory = "App_Data/Database", 
       UseEmbeddedHttpServer = true, 


      }; 

      instance.Initialize(); 
      return instance; 
     } 

     public void Flush() 
     { 
      instance.Dispose(); 
      Initialize(); 

     } 

H sao bạn vẫn tồn tại trong RavenDB và sau đó kiểm tra xem nó đã được tiếp tục? Bất kỳ lời khuyên nào về điều này sẽ tuyệt vời

+0

là có một lý do bạn đang gọi instance.Initialize(); bạn đang alreading tạo ra một thể hiện mới khi bạn nhận được vào IDocumentStore Initialize() Phương thức – MethodMan

+0

Bản thân cơ sở dữ liệu hiển thị những gì? Kiểm tra Raven Studio để đảm bảo lưu của bạn đã hoạt động. Tài liệu của bạn có ở đó không? –

Trả lời

15

Về cơ bản, EmbeddableDocumentStore mất nhiều thời gian để lưu và Index rằng dữ liệu mới, hơn tiết kiệm và truy vấn.

Vì vậy, khi xét nghiệm của bạn nói: -

  1. Store và SaveChanges.
  2. Tải.
  3. Tải này có phải không?

tải hoàn thành waaay nhanh hơn so với việc lập chỉ mục đã có thời gian hoàn thành.

Vì vậy, giống như Daniel Lang cho biết, bạn cần chờ kết quả cũ.

NHƯNG .. bạn sẽ phải thực hiện điều đó cho bất kỳ truy vấn nào bạn muốn kiểm tra, trong mã của bạn. Vì vậy .. cho phép gian lận (hợp pháp) :)

Cho cửa hàng tài liệu của bạn luôn luôn chờ kết quả cũ, nếu có điều gì đó truy vấn cửa hàng.

Làm cách nào?

// Initialise the Store. 
var documentStore = new EmbeddableDocumentStore 
        { 
         RunInMemory = true 
        }; 
documentStore.Initialize(); 

// Force query's to wait for index's to catch up. Unit Testing only :P 
documentStore.RegisterListener(new NoStaleQueriesListener()); 

.... 


#region Nested type: NoStaleQueriesListener 

public class NoStaleQueriesListener : IDocumentQueryListener 
{ 
    #region Implementation of IDocumentQueryListener 

    public void BeforeQueryExecuted(IDocumentQueryCustomization queryCustomization) 
    { 
     queryCustomization.WaitForNonStaleResults(); 
    } 

    #endregion 
} 

#endregion 

Bây giờ để xem điều này trong thực tế, hãy xem RavenOverflow @ github. Và Tests project trong dung dịch đó có tất cả các tình yêu bạn có thể muốn :)

enter image description here

+0

++. Đối với phiên bản 3: 'documentStore.Listeners.RegisterListener' –

12

Lý do là, chỉ mục ravens quá cũ để trả lại thứ gì đó ở đây. Bạn cần phải làm điều này:

session.Query<File>() 
    .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()) 
    .ToList(); 

Để đọc thêm, hãy vào đây: http://ravendb.net/docs/client-api/querying/stale-indexes

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