Как добавить элемент в ISet <T>? - PullRequest
5 голосов
/ 16 января 2012

У меня есть три класса с именами Broker, Instrument и BrokerInstrument.

using Iesi.Collections.Generic;

public class Broker : ActiveDefaultEntity
{
    public virtual string Name { get; set; }
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }
}

public class Instrument : Entity
{
    public virtual string Name { get;  set; }
    public virtual string Symbol {get;  set;}
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }
    public virtual bool IsActive { get; set; }        
}

public class BrokerInstrument : Entity
{
    public virtual Broker Broker { get; set; }
    public virtual Instrument Instrument { get; set; }
    public virtual decimal MinIncrement { get; set; }
}

Если я создаю три новых объекта (по одному для каждого типа), используя эти классы, как их связать?Например:

Instrument instrument = new Instrument { 
    Name = "Test Instrument", 
    Symbol = "Test", 
    IsActive = true 
};
Broker broker = new Broker { 
    Name = "My Test Broker", 
    IsActive = true, 
    IsDefault = false 
};
BrokerInstrument brokerInstrument = new BrokerInstrument { 
    Broker = broker, 
    Instrument = instrument, 
    MinIncrement = 0.01M 
};

Как instrument "узнает", что новый brokerInstrument теперь связан с ним?Если я сейчас запускаю if (instrument.Brokerinstruments == null), я получу true.Нужно ли связывать объекты в объявлении BrokerInstrument, а затем вернуться назад и добавить его в instrument.BrokerInstruments ISet?

Если я попытаюсь это сделать: instrument.BrokerInstruments.Add(instrument) Я получу ошибку, потому что она пуста.Смущенный.Что мне не хватает?Каков наилучший способ для моделирования таких отношений?эти объекты будут сохранены в базе данных с помощью NHibernate.

Ответы [ 3 ]

6 голосов
/ 16 января 2012

Вы получаете исключение, потому что вы не инициализируете свойство BrokerInstruments класса Instrument (то есть значение этого свойства равно нулю).Чтобы это исправить, вам нужен конструктор для Инструмента:

public Instrument() {
    BrokerInstruments = new HashSet<BrokerInstrument>();
}

Теперь, если вы хотите получить уведомление о добавлении Инструмента, это другая проблема.Самый простой и безопасный способ - заставить свойство BrokerInstruments возвращать IEnumerable, удалить метод установки и добавить метод AddBrokerInstrument:

// With this, you don't need the constructor above.
private ISet<BrokerInstrument> _brokerInstruments = new HashSet<BrokerInstrument>();

public virtual IEnumerable<BrokerInstrument> BrokerInstruments { 
    get { return _brokerInstruments; } 

    // This setter should allow NHibernate to set the property while still hiding it from external callers
    protected set { _brokerInstruments = new HashSet<BrokerInstrument>(value); } 
}

public void AddBrokerInstrument(BrokerInstrument brokerInstrument) { 
     // Any other logic that needs to happen before an instrument is added
     _brokerInstruments.Add(brokerInstrument); 
     // Any other logic that needs to happen after an instrument is added
}

Я использую IEnumerable выше, потому что вы хотите указать пользователямэтой функции, что им не разрешено добавлять инструменты непосредственно в набор - им нужно вместо этого вызвать ваш метод.

1 голос
/ 16 января 2012

Вы никогда не инициализировали инструмент. БрокерИнструменты. Вам нужно: instrument.BrokerInstruments = new ...; Я думаю, новый HashSet или новый SortedSet

1 голос
/ 16 января 2012

Чтобы иметь возможность добавить коллекцию, вы должны сначала создать ее экземпляр.Это можно сделать в соответствующих конструкторах.Мой пример использования HashSet<t> в качестве конкретной реализации ISet<T>:

public class Broker : ActiveDefaultEntity
{
    public virtual string Name { get; set; }
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }

    public Broker() {
        BrokerInstruments = new HashSet<BrokerInstrument>();
    }
}

public class Instrument : Entity
{
    public virtual string Name { get;  set; }
    public virtual string Symbol {get;  set;}
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }
    public virtual bool IsActive { get; set; }  

    public Instrument() {
        BrokerInstruments = new HashSet<BrokerInstrument>(); 
    }     
}

Затем вы должны добавить объект brokerInstrument к обоим BrokerInstruments -наборам Instrument и Broker:

var instrument = new Instrument { 
    Name = "Test Instrument", 
    Symbol = "Test", 
    IsActive = true 
};
var broker = new Broker { 
    Name = "My Test Broker", 
    IsActive = true, 
    IsDefault = false 
};
var brokerInstrument = new BrokerInstrument { 
    Broker = broker, 
    Instrument = instrument, 
    MinIncrement = 0.01M 
};
instrument.BrokerInstruments.Add(brokerInstrument);
broker.BrokerInstruments.Add(brokerInstrument);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...