Tôi có danh sách 10 đối tượng dữ liệu mà tôi muốn chèn/cập nhật cơ sở dữ liệu bằng NHibernate. Nếu một ném một ngoại lệ (nói một vi phạm chính tiểu học) tôi muốn vẫn chèn/cập nhật khác 9. Tôi cuộn từng hoạt động đối tượng vào giao dịch nguyên tử của riêng mình, và quay trở lại giao dịch nếu có một ngoại lệ. Vấn đề là nếu một giao dịch gây ra một ngoại lệ và được quay trở lại, trên giao dịch tiếp theo Nhibernate than phiền với lỗi: null id trong Nexus.Data.PortfolioCorporateĐơn nhập cảnh (không xả phiên sau khi ngoại lệ xảy ra)Nhibernate: Xử lý ngoại lệ ITransaction Vì vậy, giao dịch mới có thể tiếp tục với cùng một ISession
Chương trình chính của tôi rất đơn giản. Nó tạo ra một phiên từ một sessionfactory, tạo ra lớp truy cập dữ liệu, một số làm việc trên các đối tượng dữ liệu và sau đó cố gắng lưu các đối tượng dữ liệu đó vào cơ sở dữ liệu.
sessionsManager = new NHibernateSessionManager();
session = sessionsManager.GetSession();
DALC = new NHibernateDataProvider(session);
…
foreach (var pce in pces)
{
try
{
DALC.UpdateOrAddObject<PortfolioCorporateEntity>(pce);
}
catch (Exception ex)
{
Console.WriteLine("Could not add Corporate Entity ID " + pce.CorporateEntity.CorporateEntityID.ToString());
}
}
Đây là bản cập nhậtThêm thủ tục trong lớp Nhibernate Data Access, được gọi là 10 lần cho 10 đối tượng.
public void UpdateOrAddObject<T>(T workObject)
{
using (ITransaction tx = mSession.BeginTransaction) {
try {
mSession.SaveOrUpdate(workObject);
mSession.Flush();
tx.Commit();
}
catch (Exception ex) {
tx.Rollback();
throw;
}
}
}
Để làm rõ vấn đề, phiên được khởi tạo bởi chương trình gọi và được chuyển đến đối tượng Lớp truy cập dữ liệu, hàm tạo bên dưới.
public NHibernateDataProvider(ISession session)
{
mSession = session;
}
này hoạt động tốt, ngoại trừ sau khi ngoại lệ, nó nói không tuôn phiên sau khi ngoại lệ. Tôi không chắc chắn lý do tại sao - giao dịch được cuộn lại độc đáo và cơ sở dữ liệu phải sẵn sàng chấp nhận một giao dịch khác không? Tôi đang làm gì sai?
Từ những gì bạn được đăng, mà có vẻ như nó sẽ làm việc. Nó thực sự phụ thuộc vào việc thực hiện lớp DALC của bạn. –
Có khác nhau giữa giải pháp này (session.Close/reopen) và giải pháp trên chỉ với session.Clear()? – dataCore