使用流利的nhibernate,无论如何都有一个私有属性映射

时间:2011-03-25 12:25:22

标签: c# nhibernate

我有一个字段,我想要映射,因为它链接到数据库中的列,但我不希望任何外部类直接从我的代码访问此字段(它仅用于私人计算)。

这可能有一个我可以映射的字段,但它使用流畅的nhibernate私有吗?

3 个答案:

答案 0 :(得分:7)

是的,这是可能的。您可以使用Reveal.Member静态方法映射私有或隐藏属性

Map(Reveal.Member<string>("privateProperty"))

答案 1 :(得分:3)

我认为this正是您所寻找的。

  

Fluent映射私有属性

     

有一个争论的焦点   一些Fluent NHibernate的用户从那以后   一开始,这就是缺乏   一种映射私有和。的方法   受保护的域名属性   实体。

     

问题源于我们对lambda的使用   静态反射的表达式   你的实体,其中一个吸引人的   Fluent NHibernate的性质;通过   利用我们能够表达的表达方式   保护您的映射免受重构   副作用。但是,lambda   表达式只能参考   公开的属性   对象,这样很难   用于保护或私人   属性。

     

我们没有解决方案   理想,我们将是第一个承认   那;但考虑到Fluent   NHibernate从未被设计为   支持这些情况,以及   限制C#强加给我们,我们已经   有一些非常合理的选择。   每个选项都有自己的选项   妥协,所以你很重要   选择有的方法   妥协你更愿意   接受;我将概述优缺点   每种方法。

答案 2 :(得分:0)

这是我项目的一个例子。我的域类只有公共属性。没有二传手。 通过构造函数创建对象,并使用方法操作数据。

<强>实体

public class User: Entity
{
    private string _openid;
    private string _email;
    private string _username;
    private int roleid;

    // needed for mapping
    protected User() { }

    // your normal constructor
    public User(string openid)
    {
        Validator.NotNull(string openid, "openid is required.");
        _openid = openid;
    }

    public string Email
    {
        get { return _email; }
    }

    public string Username
    {
        get { return _username; }
    }

    public string Openid
    {
        get { return _openid; }
    }

   // Here are some methods
   // ... 
}

映射类

public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Table("user");

            // Reveal private attributes and map them
            Id(Reveal.Member<User>("_id")).Column("id");
            Map(Reveal.Member<User>("_username")).Column("username");
            Map(Reveal.Member<User>("_openid")).Column("openid_claimed_identifier");
            Map(Reveal.Member<User>("_email")).Column("email");

            // You need to create this mapping if you want to query using linq, 
            //see UserRepository below
            Map(x => x.Id, "id").ReadOnly();
            Map(x => x.Email, "email").ReadOnly();
            Map(x => x.Username, "username").ReadOnly();
            Map(x => x.Openid, "openid_claimed_identifier").ReadOnly();
        }
    }

<强>存储库

public class UserRepository : Repository<User>, IUserRepository
    {
        public UserRepository(ISession session)
           : base(session)
        {
        }

        public User find_user_by_openid(string openid_claimed)
        {
            return base.FindBy(x => x.Openid == openid_claimed);
        }

        public User find_user_by_id(int id)
        {
            return base.FindBy(x => x.Id == id);
        }        

    }

要记住一件重要的事情:不要在属性名称中使用下划线。如:

   public class User: Entity
    {
        //...
        private int role_id;
    }

当您使用特定属性映射引用时,Fluent NHibernate不喜欢它。