используя свободный nhibernate, есть ли в любом случае иметь частную собственность сопоставлена - PullRequest
2 голосов
/ 25 марта 2011

У меня есть поле, которое я хочу отобразить, так как оно ссылается на столбец в базе данных, но я не хочу, чтобы какой-либо внешний класс обращался к этому полю напрямую из моего кода (оно используется только в частных вычислениях).

возможно ли иметь поле, которое я могу отобразить, но оно будет частным, используя свободный nhibernate ??

Ответы [ 3 ]

7 голосов
/ 25 марта 2011

Да, это возможно. Вы можете использовать статические методы Reveal.Member для сопоставления частного или скрытого свойства

Map(Reveal.Member<string>("privateProperty"))
3 голосов
/ 25 марта 2011

Я думаю это - это то, что вы ищете.

Свободное отображение частных объектов

Был спор за некоторые пользователи Fluent NHibernate с начало, и это отсутствие метод картирования частных и защищенные свойства в их домене юридические лица.

Проблема связана с нашим использованием лямбда выражения для статического отражения ваши лица, один из привлекательных свойства Fluent NHibernate; от используя выражения, которые мы можем защитить ваши сопоставления от рефакторинга побочные эффекты. Тем не менее, лямбда выражения могут только ссылаться свойства, которые являются публичными на объект, так что это затрудняет использовать против защищенных или частных свойства.

Ни одно из наших решений не является идеально, мы будем первыми тот; но учитывая свободный NHibernate никогда не был предназначен для поддержать эти ситуации, и ограничения C # накладывает на нас, мы есть довольно разумный выбор. Каждый вариант имеет свой компромиссы, поэтому важно, чтобы вы выбрать метод, который имеет компромиссы, которые вы более готовы принять; Обрисую плюсы и минусы каждого подхода.

0 голосов
/ 16 февраля 2013

Это пример из моего проекта.Мои доменные классы имеют только общедоступные свойства.Нет сеттеров.Объект создается с помощью конструктора, а данные обрабатываются с использованием методов.

Сущность

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;
    }

Свободный NHibernate не нравится, когда вы используете определенный атрибут для сопоставления Ссылки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...