trong ứng dụng ASP.NET MVC của tôi, tôi đã tách mô hình miền khỏi mô hình khung nhìn.
Tôi biến đổi thực thể của mình thành một đối tượng dạng xem, vì vậy tôi có thể "cung cấp" chế độ xem của mình chỉ với dữ liệu cần thiết (tôi đã sử dụng giá trị cho mục đích này).
Trong quá trình lưu, bộ điều khiển của tôi sẽ quay trở lại đối tượng viewmodel, biến nó thành một thực thể mô hình miền và cố gắng giữ nó với SaveOrUpdate. Tôi nhận thấy rằng nếu tôi cố gắng cập nhật một bản ghi hiện có, Nhibernate coi nó là một đối tượng mới và tạo một INSERT, ngay cả khi thực thể của tôi có một ID thích hợp.
Tôi chưa tải (Nhận/Tải) thực thể trước nguyên nhân tôi muốn tránh ánh xạ lại tất cả các trường.
Tôi có làm gì sai không? Cách tốt nhất để đạt được điều đó là gì?Tôi có phải tải/Nhận thực thể trước khi SaveOrUpdate trong Nhibernate không?
***** - CẬP NHẬT - ***
điều khiển của tôi nhận được một tài khoản (ViewModel), xác nhận nó và cố gắng để lưu nó thông qua một lớp dịch vụ như một thực thể:
public ActionResult Edit(Guid id, Models.User User)
{
...
var user = new Domain.User();
user.InjectFrom(User);
user.SetId(id);
user = this._SecurityService.SaveUser(user);
}
Đây là dịch vụ:
public Domain.User SaveUser(Domain.User User)
{
bool Result = false;
if (this._ValidationEngine.IsValid(User))
{
using (_UnitOfWork)
{
if (User.Code != Guid.Empty)
{
var user = this._UserRepository.Load(User.Code);
user.InjectFrom(User);
User = this._UserRepository.Update(user);
}
else {
User = this._UserRepository.Save(User);
}
Result = _UnitOfWork.Commit();
}
}
return (User);
}
Tôi lo ngại về việc tôi phải chuyển đổi chế độ xem/thực thể của mình rất nhiều lần. Bây giờ khi tôi cố gắng lưu một Người dùng mới, tôi nhận được thông báo này: Hàng đã được cập nhật hoặc xóa bởi một giao dịch khác (hoặc bản đồ giá trị chưa được lưu không chính xác)
Có thể đây là một số cách liên quan đến những gì Darin đang nói với tôi.
Có cách nào tốt hơn để làm những gì tôi đang cố gắng làm không?
CẬP NHẬT
tôi đã nhận thấy rằng lỗi "Row đã được cập nhật hoặc xóa ..." là do thực tế là tôi có một phiên bản định nghĩa cho các ánh xạ của tôi. Điều tôi có thể hiểu là tôi cần có Id và phiên bản khớp với pháp nhân mà tôi muốn cập nhật.
Tôi muốn hiểu cách người khác làm những việc này với DDD + ASP.NET MVC + NHibernate ???
SOLUTION
Tất cả các đơn vị của tôi có một phiên bản được xác định (tôi quên nói, xin lỗi):
<version name="Version" type="System.Int32" unsaved-value="0">
<column name="Version" not-null="true" />
</version>
Như Ayende giải thích here, Nhibernate cố gắng cập nhật thực thể của tôi với một truy vấn như thế này :
UPDATE Table SET field1 = 'bla', Version = (y+1) WHERE id = x AND Version = y
trong đó y phải là phiên bản của pháp nhân của tôi. Vì tôi đã không cư trú thực thể của tôi với một phiên bản, nó sẽ tạo ra một ngoại lệ StaleObjectException.
Tôi đã thêm trường phiên bản vào chế độ xem của mình. Tôi lưu nó trong một lĩnh vực ẩn của quan điểm của tôi cùng với id.
Bộ điều khiển của tôi hiện nhận được một mô hình chế độ xem có Id và phiên bản. tôi tiêm các trường này trong thực thể tên miền của tôi và để cho các kho lưu nó (Tôi không reload thực thể của tôi):
User = this._UserRepository.Update(user);
Nếu tôi nhận được một StaleObjectException ngoại lệ nó có nghĩa là ai đó đã được cập nhật hàng DB và tôi sẽ cung cấp cho người dùng một số phản hồi.
hãy thử tải đối tượng và sau khi tái bản đồ (tôi biết bạn không muốn theo cách này), chỉ cần thử cách này và cho chúng tôi biết nếu nó hoạt động theo cách này – Omu
Tôi đoán vấn đề của tôi là với phiên bản.I've có được xác định trong ánh xạ của tôi. Để tìm một cách tốt hơn để làm điều này –
LeftyX