работа с EF4, первый подход к модели в VS 2010:
Рассмотрим следующую модель EntityModel:
"OrderBase" - это абстрактная сущность с одним свойством "Name"
«Detail» (с одним свойством «Text») - это объект, который имеет многозначную ассоциацию с «OrderBase» (т. Е. Один OrderBase имеет несколько деталей)
«Comment» (с одним свойством «Text») - это объект, который имеет многозначную связь с «OrderBase» (т. е. один OrderBase имеет несколько комментариев)
«MusicOrder» - это объект, производный от «OrderBase» с одним свойством «Количество» (int)
"SongOrder" - это объект, производный от "OrderBase" только с одним свойством "Length" (int).SongOrder имеет отношение один к одному с MusicOrder (т. Е. Один MusicOrder имеет несколько SonOrders)
Для краткого обзора: хотел опубликовать изображение datamdel, но я не позволил ... Так что любые вопросы, касающиесямодель данных.
Итак, теперь я генерирую свою базу данных, выполняю сценарий ddl и пытаюсь запустить следующий код:
using (DataContainer container = new DataContainer())
{
MusicOrder musicOrder = new MusicOrder{Name = "Oldies", Quantity = 1};
SongOrder songOrder = new SongOrder {Name = "Great balls of fire", Length = 240};
songOrder.Details.Add(new Detail{Text = "Song from Jerry Lee Lewis"});
songOrder.Comments.Add(new Comment{Text = "Cool song"});
container.OrderBaseSet.AddObject(songOrder); //relevant line
musicOrder.SongOrders.Add(songOrder);
songOrder.Details.Clear();
songOrder.Comments.Clear();
container.OrderBaseSet.AddObject(musicOrder);
container.SaveChanges();
}
В этом случае «SaveChanges» приводит к исключению, сообщающему мне что-тоо пропущенных отношениях внешнего ключа ...
Но если я переместу строку
container.OrderBaseSet.AddObject(songOrder);
после части "Очистить", в результате получится следующий код:
using (DataContainer container = new DataContainer())
{
MusicOrder musicOrder = new MusicOrder{Name = "Oldies", Quantity = 1};
SongOrder songOrder = new SongOrder {Name = "Great balls of fire", Length = 240};
songOrder.Details.Add(new Detail{Text = "Song from Jerry Lee Lewis"});
songOrder.Comments.Add(new Comment{Text = "Cool song"});
musicOrder.SongOrders.Add(songOrder);
songOrder.Details.Clear();
songOrder.Comments.Clear();
container.OrderBaseSet.AddObject(songOrder); //relevant line
container.OrderBaseSet.AddObject(musicOrder);
container.SaveChanges();
}
все работает отлично.
Как вы можете видеть, я знаю, как обойти исключение, и я знаю, что нет смысла "дважды добавлять" SongOrder.Но мне интересно, это ошибка или особенность.Почему исключение брошено в моем первом примере.Был бы очень признателен за исчерпывающее объяснение.На мой взгляд, структура сущностей также должна быть в состоянии справиться с первым примером и не создавать исключения.Так что я бы сказал, что это ошибка.
Не стесняйтесь комментировать;)
Andi