Как мне сопоставить коллекцию, доступную через свойство только для чтения? - PullRequest
0 голосов
/ 31 января 2011

Как мне сопоставить коллекцию деталей, используя соглашение?

public class Part
{
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }
}

public class Car
{
  private readonly List<Part> _parts = new List<Part>();

  public virtual int Id { get; set; }

  public virtual IList<Part> Parts
  {
    get { return _parts.AsReadOnly(); }
  }
}

Я пробовал это соглашение, но оно всегда ожидает имя поля без префикса подчеркивания:

public class HasManyConvention : IHasManyConvention
{
  public void Apply(IOneToManyCollectionInstance instance)
  {
    instance.Access.ReadOnlyPropertyThroughCamelCaseField(CamelCasePrefix.Underscore);
  }
}

Я пробовал это с билдами 1.2.0.694 и 2.0.0.698 с тем же результатом:

"Could not find field 'parts' in class 'TestFluentNHibernate.Car'"

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Прежде всего, ваш член _parts не может быть доступен только для чтения.NHibernate нужен доступ на запись к члену, чтобы установить значение / ссылку.Чтобы вернуть действительно доступную только для чтения коллекцию через свойство Parts, необходимо вернуть System.Collections.ObjectModel.ReadOnlyCollection.Это также «удаляет» все методы, найденные в типах коллекций чтения / записи, которые все еще существуют, если вы просто возвращаете f.ex.list.AsReadOnly ().Список только для чтения, возвращаемый таким способом, все еще имеет метод .Add () и другие для редактирования коллекции, но они вызовут исключение времени выполнения, поэтому возврат ReadOnlyCollection для начала отлично подходит для предотвращения этой возможности.

Многим людям нравится возвращать IEnumerable, который также доступен только для чтения, но его можно привести к списку или другому типу коллекции для чтения / записи и изменить таким образом.

Вам необходимо реализовать AddPart иМетоды RemovePart, позволяющие внешнему коду добавлять и удалять элементы в коллекции только для чтения.

Ваше соглашение выглядит правильно, я использую точно такой же синтаксис с 1.2.0.694 успешно , мойсоглашение:

     instance.Key.Column(instance.EntityType.Name + "Fk");
     instance.Fetch.Subselect();
     instance.Inverse();
     instance.Cascade.All();
     instance.Access.ReadOnlyPropertyThroughCamelCaseField(CamelCasePrefix.Underscore);

Пример класса:

public class Car
{
    private List<Part> _parts;

    public Car()
    {
        // Initialize member collection _parts
        _parts = new List<Part>();
    }

    public virtual int Id { get; set; }

    // Return readonlycollection here, ReadOnlyCollection implements 
    // IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable,
    // so the returned list can be any collection type inheriting from these base types.
    public ReadOnlyCollection<Part> Parts
    {
        get { return new List<Part>(_parts).AsReadOnly(); } }
    }

    public AddPart(Part part)
    {
        // Usually I don't want duplicates
        if (!_parts.Contains(part))
            _parts.Add(part);
    }
}
0 голосов
/ 07 февраля 2011

Надеюсь, это поможет. Попробуйте ...

public class Car
{
  protected virtual List<Part> _parts { get;set; }

  public Car()
  {
    // Initialize "Parts" to not be null
    this.Parts = new List<Part>();
  }
  public void PopulateParts (int someID)
  {
    // Do a call out to one of your helpers to populate "Parts"
    // so it can be used.
    //this.Parts = SomeCall(someID);
  }

  public virtual int Id { get; set; }

  public virtual IList<Part> Parts
  {
    get { return this._parts; } // No need for "ReadOnly" since "protected set" will prevent changes outside of this class.
    protected set { this._parts = value; }
  }
}

Защищенный набор сделает этот элемент доступным только для чтения за пределами класса Car. Поскольку я не понимаю, как вы собираетесь заполнять части, я создал вызов PopulateParts в качестве ловушки, чтобы вы могли заполнять список.

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