【问题标题】:Fluent NHibernate Map to private/protected Field that has no exposing PropertyFluent NHibernate 映射到没有暴露属性的私有/受保护字段
【发布时间】:2010-04-23 22:54:03
【问题描述】:

我有以下 PersonGender 类(我不是真的,但为了理解我的意思,这个例子被简化了),使用 NHibernate (Fluent NHibernate) 我想映射数据库列“@987654324 @" [INT] 值到我的 Person 类中受保护的 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();
    }
}

【问题讨论】:

标签: nhibernate fluent-nhibernate


【解决方案1】:

正如 dotjoe 所说,我认为您需要将其公开为受保护的属性。然后你可以使用Reveal 映射来获得它。

您的类/映射可能看起来类似于

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


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

如果有帮助,也有类似的问题herehere

【讨论】:

  • 仅供通过 Google 访问的用户参考:Reveal.Property 已弃用。请改用Reveal.Member
【解决方案2】:

只需将其设为受保护的财产。 NH 反射不需要公共属性。

protected virtual int _genderId { get; set; }

然后像这样映射(抱歉一直没能流利)...

&lt;property name="_genderId" column="genderId" /&gt;

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

【讨论】:

    【解决方案3】:

    我只是第一次使用 nHibernate,但我相信您不需要为此创建受保护的属性,您只需在映射中指定 access="field" 即可直接映射到私人领域。例如

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

    这样对您的域层的影响较小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2014-06-26
      • 2023-03-07
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多