Tôi đã có một cái gì đó lớp như thế này:Bỏ qua phương pháp trên các loại thực thể với nHibernate
public class Account
{
public virtual int Id { get; private set; }
public virtual string Username { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
public virtual string Password { get; private set; }
public void SetPassword(string password){ ... }
public bool CheckPassword(string password) { ... }
}
tôi đã thiết lập nó theo cách này vì tôi không bao giờ muốn Password
sở hữu sử dụng trực tiếp trong mã đó sử dụng loại Account
. Bản đồ Tài khoản trông giống như sau:
public class AccountMap : ClassMap<Account>
{
public AccountMap()
{
Id(x => x.Id);
Map(x => x.Username);
Map(x => x.Password);
}
}
Khi tôi thực sự sử dụng này với NHibernate tôi nhận được một InvalidProxyTypeException
NHibernate.InvalidProxyTypeException: The following types may not be used as proxies:
Fringine.Users.Account: method SetPassword should be virtual
Fringine.Users.Account: method CheckPassword should be virtual
Tôi hiểu rằng NHibernate đang cố gắng để tạo ra một lớp proxy để hỗ trợ tải lười biếng và rằng Tôi có thể đánh dấu các phương thức như ảo thêm một Not.LazyLoad() vào bản đồ để giải quyết ngoại lệ. Nhưng - tôi không muốn làm một trong số đó. Tôi muốn hỗ trợ tải chậm nhưng tôi không thấy lý do tại sao những phương pháp đó cần phải là ảo.
Không NHibernate (hoặc Castle nội bộ) đánh giá nội dung của phương pháp để xác định trường nào được sử dụng và tối ưu hóa tải chậm cho các thuộc tính đó? Nếu không, tại sao phương thức này cần phải là ảo nếu tất cả các thuộc tính là và chúng sẽ được tải xuống khi chúng được tham chiếu bởi phương thức.
Có cách nào để loại trừ một số phương pháp nhất định khỏi yêu cầu ảo không?
Tôi không chắc là nó quan trọng nếu tôi truy cập một trường trong các phương thức đó. Khi trường được truy cập thông qua thuộc tính proxy của nó, nó sẽ khởi tạo cá thể. Các thuộc tính/phương thức duy nhất thực sự cần được ảo hóa là các thuộc tính thực sự đại diện cho các cột trong bảng. –
@Paul: Không, bạn hiểu lầm. Bạn * có thể * truy cập các trường * trực tiếp * trong các phương thức của bạn. Không có gì sai với điều đó, bạn không cần phải lo lắng về việc tải chậm trong trường hợp này. Mã trong thực thể của bạn là * luôn luôn * được thực hiện trong một thực thể được khởi tạo hoàn toàn. Điều này làm cho NH minh bạch hơn. Thật hiếm khi có các cá thể thành viên không phụ thuộc vào trạng thái của cá thể, do đó, có một không gian rất hạn chế để tối ưu hóa. –
Ahh, tôi đã hiểu lầm. Việc bảo vệ truy cập trường không có ý nghĩa. –