代码之家  ›  专栏  ›  技术社区  ›  Jon Erickson

fluent nhibernate映射到没有公开属性的私有/受保护字段

  •  8
  • Jon Erickson  · 技术社区  · 15 年前

    我有以下的 Person Gender 类(我不是真的,但是为了理解我的观点,这个例子被简化了),使用nhibernate(fluent nhibernate)我想映射数据库列” GenderId “[int]值到受保护的int _genderId 我的领域 班级。我该怎么做?

    仅供参考,映射和域对象在单独的程序集中。

    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();
        }
    }
    
    3 回复  |  直到 12 年前
        1
  •  4
  •   dotjoe    15 年前

    把它变成受保护的财产。NH反射不需要公共财产。

    protected virtual int _genderId { get; set; }

    然后像这样画地图(抱歉,我没能说流利的话)……

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

    另外,可能更容易映射枚举。可以将列存储为枚举值或文本。很多这样的例子。

        2
  •  15
  •   Community CDub    7 年前

    正如dotjoe所说,我认为您需要将其作为受保护的财产公开。然后你可以用 Reveal 映射。

    您的类/映射可能会沿着

    public class Person : Entity
    {
        protected int genderId{ get; set; }
    }
    
    
    public PersonMap : ClassMap<Person>
    {  
        public PersonMap()  
        {  
            Map(Reveal.Member<Person>("genderId")) 
        }  
    }
    

    也有类似的问题 here here 如果有帮助的话。

        3
  •  2
  •   Mr. Bungle    15 年前

    我只是第一次使用nhibernate,但我相信您不需要为此创建受保护的属性,只需在映射中指定access=“field”,就可以直接映射到私有字段。例如。

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

    这样对域层的影响就小了。