Картографирование частной коллекции в беглом nhibernate - PullRequest
7 голосов
/ 23 апреля 2009

Как я могу отобразить это:

public class Customer
{
   private IList<Order> _orders;
   public IEnumerable<Order> 
   GetAllOrders()
   {
      return _orders;     
   }
}

На странице проекта есть несколько примеров, но ни один из них не касается этой ситуации. Вот этот образец:

// model   
public class Account   
{   
  private IList<Customer> customers = new List<Customer>();   

  public IList<Customer> Customers   
  {   
    get { return customers; }   
  }   
}

// mapping   
HasMany(x => x.Customers)   
  .Access.AsCamelCaseField();  

Но предполагается, что у Пользователя есть открытое поле Клиенты, и этот сценарий отличается от моего. Я пробовал несколько возможных вариантов, но ни один не работает:

HasMany(x => Reveal.Propertie("_orders"))

Закрытые поля отлично работают при простом сопоставлении свойств, но при сопоставлении коллекций. совсем другое. Любая идея? Спасибо

Ответы [ 3 ]

24 голосов
/ 23 апреля 2009

Самое простое решение - представить вашу коллекцию в качестве публичного свойства Orders, а не метода GetAllOrders (). Тогда ваше отображение

HasMany(x => x.Orders)
    .Access.AsCamelCaseField(Prefix.Underscore);

и ваш класс

public class Customer
{
    private IList<Order> _orders = new List<Order>();

    public IEnumerable<Order> Orders 
    { 
        get { return _orders; }
    }
}

Если это не сработает, вы можете отобразить личные свойства , используя отображение Откровения Fluent NHibernate.

Отредактировано, чтобы добавить: Только что сделав это, правильный ответ:

HasMany<Order>(Reveal.Property<Customer>("_orders")) etc.

Коллекция должна быть представлена ​​как защищенное виртуальное свойство, чтобы разрешить проксирование:

protected virtual IList<Order> _orders { get; set; }

Этот ответ поставил меня на правильный путь.

1 голос
/ 03 июня 2014

Вы можете отобразить полностью частную коллекцию, используя Reveal.Member(), но у нее есть определенное и неочевидное ограничение: Expression, который принимает HasMany(), должен возвращать либо IEnumerable<TReferenced>, либо object.

Для вашего класса:

public class Customer
{
    private IList<Order> _orders;
    public IEnumerable<Order> GetAllOrders()
    {
        return _orders;     
    }
}

следующая строка заполнит коллекцию _orders:

HasMany(Reveal.Member<Customer, IEnumerable<Order>>("_orders"));
    //additional mapping behaviors

Для полноты - следующая строка выдает ошибку компилятора:

HasMany(Reveal.Member<Customer, IList<Order>>("_orders"));
1 голос
/ 23 апреля 2009

Спасибо. Ваше решение в порядке. Однако могут быть ситуации (гипотетические), когда вы не хотите раскрывать свою частную коллекцию. Этот сценарий сопоставления не объясняется в вашей связанной публикации, поскольку существует разница между отображением простых свойств, описанных в этой публикации, и сопоставлением коллекции. Моя попытка использовать HasMany (x => Reveal.Propertie ("_ orders")) не удалась из-за возбужденного исключения.

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