Tôi nhận được Ngoại lệ TransientObjectException khi cố lưu một đối tượng là một phần của mối quan hệ nhiều-nhiều. Tôi hiểu tại sao điều này lại xảy ra, nhưng muốn hiểu cách thực hiện đúng những gì tôi đang cố gắng làm.
Tóm lại, những gì tôi đang cố gắng làm:
Ứng dụng của tôi có danh sách người dùng và danh sách vai trò. Người dùng có thể được chỉ định cho nhiều vai trò và các vai trò có thể được chỉ định cho nhiều người dùng. Có một trang web nơi quản trị viên có thể thực hiện các nhiệm vụ này và các nhiệm vụ có thể được thực hiện theo cả hai cách (ví dụ: quản trị viên có thể chọn một người dùng rồi thêm vai trò cho họ; hoặc chọn một vai trò và thêm người dùng vào vai trò đó).
Ví dụ: giả sử quản trị viên nhấp vào "Chỉnh sửa" cho người dùng "Alice". Quản trị viên sẽ thấy danh sách các vai trò có sẵn và danh sách các vai trò được gán cho Alice. Sau đó, quản trị viên chỉ định cho Alice một vai trò mới và nhấp vào "Lưu".
Trên máy chủ, nhận người dùng tạm thời và các đối tượng vai trò được chỉ định từ máy khách. Nếu tôi chỉ gán danh sách vai trò tạm thời cho đối tượng người dùng (ví dụ:user.Roles = vai trò
), tôi có thể cập nhật tốt. Tuy nhiên, nếu tôi tình cờ đọc Người dùng từ cơ sở dữ liệu trước khi thực hiện nhiệm vụ này, tôi sẽ nhận được Ngoại lệ TransientObjectException trên đối tượng Vai trò được liên kết.
Định nghĩa lớp:
lớp công khai Vai trò
{
ID hướng dẫn công khai { được đặt;
IList ảo công khai Người dùng { get;
}
public class User
{
ID hướng dẫn công khai { được đặt;
IList ảo công khai Vai trò { được đặt;
}
Lập bản đồ:
Mã để lưu (hợp lệ)
public void UpdateUser(Người dùng người dùng, IList linkedRoles)
{
sử dụng (var session = _sessionFactory.OpenSession())
{
user.Roles = linkedRoles;
session.Merge(người dùng);
}
}
Mã để lưu (không thành công)
public void UpdateUser(Người dùng người dùng, IList linkedRoles)
{
sử dụng (var session = _sessionFactory.OpenSession())
{
Người dùng gốcUser = session.Get(user.ID);
// Mã thực hiện một số báo cáo/ghi nhật ký kiểm tra
LogDifferences(người dùng gốc, người dùng);
user.Roles = linkedRoles;
session.Merge(người dùng);
}
}
Đối tượng là một phiên bản tạm thời chưa được lưu - lưu phiên bản tạm thời trước khi hợp nhất
Jouni Aro nói đúng... bạn không thể có hai thực thể có cùng ID trong phiên của mình.
Vấn đề là một trong những điều sau đây:
- Bạn đang cố tải từ cơ sở dữ liệu
người dùng gốc
,Nhưng user
Đã được đính kèm vào cùng một phiên
- bạn đã tải
người dùng gốc
, rồi cố gắng user
Hợp nhất vào cùng một phiên - theo đề xuất của Jouni, trước tiên hãy đuổi người dùng gốc
Dù sao, bạn có thực sự cần tải người dùng ban đầu để biết điều gì đã thay đổi không? Có nhiều cách khác để thực hiện việc này bằng NHibernate. bạn đã thử nó chưamáy bay đánh chặn ?
Đây là một cách sử dụng tiềm năng:http://nhforge.org/wikis/howtonh/finding-dirty-properties-in-nhibernate.aspx . GoogleMột chút nữa.
Giới thiệu về c# - Làm cách nào để cập nhật chính xác mối quan hệ nhiều-nhiều NHibernate với các đối tượng thoáng qua? Ngoại lệ đối tượng thoáng qua, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/10819567/
Tôi là một lập trình viên xuất sắc, rất giỏi!