Được rồi, tôi đã thấy một số bài viết hỏi gần như giống nhau nhưng các điểm khác nhau một chút.NHibernate FlushMode Auto Not Flushing Trước khi tìm
Đây là trường hợp điển hình: Tôi đang lưu/cập nhật thực thể và trong PHIÊN BẢN ĐẾN, tôi đang cố gắng lấy chúng từ cơ sở dữ liệu (sử dụng tiêu chí/tìm/đếm/etc) với FlushMode = Tự động. Vấn đề là: NHibernate không xóa các cập nhật trước khi truy vấn, vì vậy tôi nhận được dữ liệu không nhất quán từ cơ sở dữ liệu.
"Fair đủ", một số người sẽ nói, như tài liệu khẳng định:
Quá trình này, tuôn ra, xảy ra theo mặc định ở những điểm sau đây:
- từ một số lời gọi của Tìm() hoặc Enumerable()
- từ NHibernate.ITransaction.Commit()
- từ ISession.Flush()
Chữ đậm "một số lời gọi" rõ ràng nói rằng NH không có trách nhiệm gì cả. IMO, tuy nhiên, chúng tôi có vấn đề nhất quán ở đây vì tài liệu cũng nêu rõ rằng:
Trừ khi bạn phát hiện Flush(), hoàn toàn không có gì đảm bảo về thời điểm Phiên thực thi lệnh gọi ADO.NET, chỉ theo thứ tự trong đó chúng được thực hiện. Tuy nhiên, NHibernate đảm bảo rằng các phương thức ISession.Find (..) sẽ không bao giờ trả về dữ liệu cũ; họ cũng sẽ không trả lại dữ liệu sai.
Vì vậy, nếu tôi đang sử dụng CreateQuery (Tìm thay thế) và lọc cho các đơn vị với giá trị tài sản = 20, NH có thể KHÔNG thực thể trở lại với giá trị = 30, phải không? Nhưng đó là những gì xảy ra trong thực tế, bởi vì Flush không xảy ra tự động khi cần.
public void FlushModeAutoTest()
{
ISession session = _sessionFactory.OpenSession();
session.FlushMode = FlushMode.Auto;
MappedEntity entity = new MappedEntity() { Name = "Entity", Value = 20 };
session.Save(entity);
entity.Value = 30;
session.SaveOrUpdate(entity);
// RETURNS ONE ENTITY, WHEN SHOULD RETURN ZERO
var list = session.CreateQuery("from MappedEntity where Value = 20").List<MappedEntity>();
session.Flush();
session.Close();
}
Sau khi tất cả: tôi hiểu sai, có phải lỗi hoặc đơn giản là tính năng không thể đoán trước để mọi người phải gọi Flush để đảm bảo công việc của mình?
Cảm ơn bạn.
Filipe
tks Thiên Chúa, bạn nói đúng! :) Sử dụng một giao dịch rõ ràng xung quanh khối mã đã giải quyết được vấn đề. Chúng tôi có thể sử dụng tiêu chí, tạo truy vấn, bất cứ điều gì, thay đổi đã được cam kết và kết quả truy vấn vượt qua bài kiểm tra. Cám ơn bạn một lần nữa! Tôi sẽ đề nghị NH nhóm cập nhật tài liệu và nêu rõ rằng chức năng tự động tuôn ra chỉ hoạt động bên trong một giao dịch rõ ràng, hy vọng điều này sẽ giúp nghi ngờ trong tương lai. – jfneis
Bạn được chào đón. Câu hỏi hay, tôi chưa bao giờ hiểu điều này cho đến bây giờ. –
Rất cám ơn! Nó giải quyết vấn đề của tôi. –