Tôi đã triển khai người nghe kiểm tra các thay đổi đối với các bảng trong ứng dụng của tôi bằng cách sử dụng IPreUpdateEventListener
và IPreInsertEventListener
và mọi thứ hoạt động ngoại trừ các mối quan hệ nhiều người không có dữ liệu bổ sung trong khi tham gia bảng (tức là tôi không có một POCO cho bảng tham gia).Kiểm tra mối quan hệ nhiều-nhiều trong NHibernate
Mỗi đối tượng có thể kiểm tra thực hiện giao diện IAuditable
, do đó trình xử lý sự kiện sẽ kiểm tra xem POCO có thuộc loại IAuditable
hay không và liệu nó có ghi lại bất kỳ thay đổi nào đối tượng không. Tra cứu bảng triển khai thực hiện IAuditableProperty
inteface, vì vậy nếu thuộc tính của IAuditable
POCO trỏ đến bảng tra cứu, các thay đổi được ghi lại trong nhật ký cho POCO chính.
Vì vậy, câu hỏi đặt ra là, làm cách nào để xác định tôi đang làm việc với một bộ sưu tập nhiều người và ghi lại những thay đổi trong bảng kiểm toán của tôi?
Chỉnh sửa: Tôi đang sử dụng NHibernate 2.1.2.4000
//first two checks for LastUpdated and LastUpdatedBy ommitted for brevity
else if (newState[i] is IAuditable)
{
//Do nothing, these will record themselves separately
}
else if (!(newState[i] is IAuditableProperty) && (newState[i] is IList<object> || newState[i] is ISet))
{
//Do nothing, this is a collection and individual items will update themselves if they are auditable
//I believe this is where my many-to-many values are being lost
}
else if (!isUpdateEvent || !Equals(oldState[i], newState[i]))//Record only modified fields when updating
{
changes.Append(preDatabaseEvent.Persister.PropertyNames[i])
.Append(": ");
if (newState[i] is IAuditableProperty)
{
//Record changes to values in lookup tables
if (isUpdateEvent)
{
changes.Append(((IAuditableProperty)oldState[i]).AuditPropertyValue)
.Append(" => ");
}
changes.Append(((IAuditableProperty)newState[i]).AuditPropertyValue);
}
else
{
//Record changes for primitive values
if(isUpdateEvent)
{
changes.Append(oldState[i])
.Append(" => ");
}
changes.Append(newState[i]);
}
changes.AppendLine();
}
Đào sâu hơn vào điều này, nó xuất hiện các sự kiện 'OnPreUpdate' và' OnPreInsert' của tôi thậm chí không kích hoạt khi tôi sửa đổi các bộ sưu tập nhiều thành nhiều, nhưng các thay đổi đang được lưu vào cơ sở dữ liệu. Đây có lẽ là hành vi mong đợi do một số ma thuật sâu sắc hơn của NHibernate, nhưng nó cảm thấy giống như một lỗi/ommision với khối lượng chưa rửa ... – Kendrick