none
Один-ко-многим в EF Code First RRS feed

  • Вопрос

  • Доброго времени суток!

    Имеются два класса:

    public partial class MoneyDocument { public MoneyDocument() { this.MoneyRecords = new HashSet<MoneyRecord>(); } public virtual ICollection<MoneyRecord> MoneyRecords { get; set; } } public partial class MoneyRecord { public MoneyRecord() { } public long Id { get; set; } public double Amount { get; set; } public virtual MoneyDocument ParentDocument { get; set; }

    }

    и, к примеру, такой код, использующий их:

    var document = new MoneyDocument();
    var record = new MoneyRecord();
    document.MoneyRecords.Add(record);
    Возник вопрос, что нужно сделать чтобы при выполнении этого кода свойство record.ParentDocument  устанавливалось в значение соответствующего document? Или единственный выход это писать свой метод в MoneyDocument:
    public void AddMoneyRecord(MoneyRecord record) {
       record.MoneyDocument = this;
       MoneyRecords.Add(record);
    }

    17 апреля 2013 г. 12:21

Ответы

  • Понял. Это не СУБД и подобные связи в коде не отсдеживаются. Вы должны их задать сами, ваш первоначальный вариант хороший. Можете и так например:

    var moneyDocument = new MoneyDocument();
    var moneyRecord = new MoneyRecord() { ParentDocument = moneyDocument };
    moneyDocument.MoneyRecords.Add(moneyRecord);
    В любом случае это должны делать вы.
    • Помечено в качестве ответа Varlamov Oleg 18 апреля 2013 г. 7:56
    18 апреля 2013 г. 7:46
    Модератор

Все ответы

  • "Возник вопрос, что нужно сделать чтобы при выполнении этого кода свойство record.ParentDocument  устанавливалось в значение соответствующего document?" - если эта же связь проецируется на БД (что почти всегда должно быть так), т.е. и там между таблицами будет эта же связь, то ничего делать не нужно. При обращении к свойству record.ParentDocument оно автоматически загрузит данные с БД. А если этого нет, то метод инициализации надо писать самому, но обычно эта логика помещается в конструктор.
    18 апреля 2013 г. 6:04
    Модератор
  • С существующими в БД записями все нормально. Они корректно подгружают свои свойства. Вопрос как раз-таки в новых записях, которые еще не сохранены в БД. Если я выполню

    document.MoneyRecords.Add(record);

    , то record.ParentDocument будет null. Меня интересует можно ли сделать так, чтобы после выполнения этого  record.ParentDocument СРАЗУ установился в соответствующий MoneyDocument?

    18 апреля 2013 г. 7:28
  • Понял. Это не СУБД и подобные связи в коде не отсдеживаются. Вы должны их задать сами, ваш первоначальный вариант хороший. Можете и так например:

    var moneyDocument = new MoneyDocument();
    var moneyRecord = new MoneyRecord() { ParentDocument = moneyDocument };
    moneyDocument.MoneyRecords.Add(moneyRecord);
    В любом случае это должны делать вы.
    • Помечено в качестве ответа Varlamov Oleg 18 апреля 2013 г. 7:56
    18 апреля 2013 г. 7:46
    Модератор
  • Ясно, просто когда использовался ObjectContext такой механизм присутствовал. Хотя если мне не изменяет память, то там автоматически создавались методы AddObject(Entity), которые скорее всего делали то же самое, что и мой метод AddMoneyRecord.

    Ладно, с EF все ясно в таком случае. Думаю, стоит посмотреть как обстоит дело с этим механизмом в NHibernate.

    18 апреля 2013 г. 7:55