2009-03-25 49 views
9

Tôi có một thực thể người chứa một địa chỉ như một đối tượng giá trị:đối tượng giá trị Null trong NHibernate

public Person() 
{ 
    WithTable("Person"); 
    Id(x => x.Id); 
    Component<Address>(x => x.Address, a => 
    { 
     a.Map(x => x.Address1); 
     a.Map(x => x.Address2); 
     a.Map(x => x.Address3); 
     a.Map(x => x.Town); 
     a.Map(x => x.Postcode); 
    }); 
} 

Nó khẳng định trong các tài liệu NHibernate rằng nếu tất cả các thuộc tính của một đối tượng giá trị (Address1, Address2 vv) là null, toàn bộ thành phần sẽ được ánh xạ dưới dạng null (tức là Person.Address sẽ là null). Điều này khiến tôi gặp vấn đề trong trường hợp tất cả các trường địa chỉ đều trống vì trong các trang của tôi mà tôi có thể có (Tôi đang làm ASP MVC):

<%= Html.TextBoxFor((x => x.Address.Address1))%> 

Điều này vi phạm ngoại lệ tham chiếu null. Vì vậy, tôi đang tìm một cách sạch sẽ để thiết lập địa chỉ như là một địa chỉ mới() thay vì null nếu tất cả các lĩnh vực có sản phẩm nào khi tôi tải một người từ cơ sở dữ liệu mà không làm nó bằng tay. Tôi đã giảm giá các ý tưởng sau đây:

Làm kiểm tra null trong quan điểm của tôi (yuk, khủng khiếp)

Làm lĩnh vực cơ sở dữ liệu không nullable (Tôi đang làm việc với một cơ sở dữ liệu di sản)

Bất cứ ai bất kỳ ý tưởng ?

Trả lời

2

Tôi không có bất kỳ câu trả lời dứt khoát nào tạo phương thức truy cập thuộc tính/phương thức không được ánh xạ và trả về đối tượng mặc định/null nếu địa chỉ thực tế là rỗng.

public Address GetAddressOrDefault() 
{ 
    return Address ?? new NullAddress(); 
} 

Hoặc tương tự như thứ nhất, tạo trình bao bọc cho Address mà bạn sử dụng trong chế độ xem.

public class AddressViewData 
{ 
    private Address address; 

    public AddressViewData(Address address) 
    { 
    this.address = address ?? new NullAddress(); 
    } 

    // expose all address properties as pass-throughs 
    public string Street 
    { 
    get { return address.Street; } 
    } 
} 
+0

Trở nên khá xấu xí ngay khi bạn thực sự cần chỉnh sửa địa chỉ trong giao diện người dùng, không chỉ hiển thị địa chỉ, phải không? – alex

+0

Đúng, có đề xuất tốt hơn? –

+0

Ý tưởng tuyệt vời, cảm ơn! Sửa đổi trình truy cập thuộc tính Address được ánh xạ thực tế để cho phép nhận và thiết lập như bình thường, nhưng sử dụng kiểm tra null của bạn trong phần "Address ?? new Address();" công trinh. Bây giờ tôi có thể tải và chỉnh sửa địa chỉ ngay cả khi chúng trống, không sửa đổi chế độ xem của tôi và chế độ ngủ đông không bị nhầm lẫn. –

5

Nhờ ý tưởng của James (xem câu trả lời và ý kiến ​​của mình) Tôi đã sửa đổi tài sản Địa chỉ của thực thể trong bảng Person từ:

public virtual string Address { get; set; } 

tới:

private Address _address; 
public virtual Address Address 
{ 
    get { return _address ?? new Address(); } 
    set { _address = value; } 
} 

này đã giải quyết vấn đề của tôi, nó hoạt động, và nó có vẻ làm việc với NHibernate. Yey!

0

Trong một số trường hợp, rất dễ dàng để viết loại tùy chỉnh NHibernate. Thay vì thiết lập thành phần thành null, nó sẽ trả về đối tượng null. Tôi đã làm điều này trong một số trường hợp, sau đó bạn có thể quên về null.

Example of a composite user type.

Các vấn đề liên quan