2010-04-23 28 views
8

Tôi có các lớp PersonGender sau đây (Tôi không thực sự, nhưng ví dụ được đơn giản hóa để lấy điểm của tôi), sử dụng NHibernate (Fluent NHibernate) I muốn ánh xạ cột Cơ sở dữ liệu "GenderId" [INT] giá trị vào trường được bảo vệ int _genderId trong lớp Person của tôi. Làm thế nào để tôi làm điều này?Fluent NHibernate Bản đồ thuộc về trường tư nhân/được bảo vệ Không có tài sản lộ diện

FYI, ánh xạ và đối tượng miền nằm trong các hội đồng riêng biệt.

public class Person : Entity 
{ 
    protected int _genderId; 

    public virtual int Id { get; private set; } 
    public virtual string Name { get; private set; } 

    public virtual Gender Gender 
    { 
     get { return Gender.FromId(_genderId); } 
    } 
} 

public class Gender : EnumerationBase<Gender> 
{ 
    public static Gender Male 
     = new Gender(1, "Male"); 

    public static Gender Female 
     = new Gender(2, "Female"); 

    private static readonly Gender[] _genders 
     = new[] { Male, Female }; 

    private Gender(int id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 

    public int Id { get; private set; } 
    public string Name { get; private set; } 

    public static Gender FromId(int id) 
    { 
     return _genders.Where(x => x.Id == id).SingleOrDefault(); 
    } 
} 
+0

Tôi đã đăng một ví dụ đầy đủ tại đây: http://stackoverflow.com/questions/5432380/using-fluent-nhibernate-is-there-anyway-to-have-a-private-property-mapped –

Trả lời

4

chỉ cần biến nó thành thuộc tính được bảo vệ. Phản xạ NH không yêu cầu tài sản công cộng.

protected virtual int _genderId { get; set; }

sau đó bản đồ như vậy (xin lỗi không bao giờ có xung quanh để thành thạo) ...

<property name="_genderId" column="genderId" />

cũng có, nó có thể được dễ dàng hơn để chỉ bản đồ enum. Bạn có thể có cột được lưu trữ dưới dạng giá trị hoặc văn bản Enum. Rất nhiều ví dụ về điều đó.

15

Như dotjoe đã nói, tôi nghĩ bạn cần phơi bày nó như một tài sản được bảo vệ. Sau đó, bạn có thể truy cập nó bằng cách sử dụng ánh xạ Reveal.

lớp học của bạn/lập bản đồ có thể sẽ tìm kiếm một cái gì đó dọc theo dòng của

public class Person : Entity 
{ 
    protected int genderId{ get; set; } 
} 


public PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Map(Reveal.Member<Person>("genderId")) 
    } 
} 

Ngoài ra còn có câu hỏi tương tự herehere nếu giúp.

+2

FYI đối với những người nhận được thông qua Google: 'Reveal.Property' không được chấp nhận. Sử dụng 'Reveal.Member' để thay thế. –

+0

@CharlieKilian: Đã sửa lỗi, cảm ơn bạn! – R0MANARMY

2

Tôi chỉ sử dụng nHibernate lần đầu tiên, nhưng tôi tin rằng bạn không cần phải tạo thuộc tính được bảo vệ cho điều này, bạn chỉ cần chỉ định access = "field" trong ánh xạ của mình và bạn có thể ánh xạ trực tiếp trường riêng. Ví dụ.

<property name="_genderId" access="field" column="GenderId" type="Int32" /> 

Bằng cách này, ít tác động hơn đến lớp miền của bạn.

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