Дай угадаю - Cat.GetById(1)
выглядит так:
public static Cat GetById(int id)
{
using (var context = new PhonebookEntities())
{
return context.Cats.Single(c => c.Id == id);
}
}
Вы используете два разных контекста - вот источник проблемы. Первый контекст загружает Cat и заполняет его EntityKey
, но второй контекст не знает этого экземпляра, поэтому, как только вы вызовете AddToCats
, он также добавит новые Cat
и ParentCat
, но произойдет сбой, потому что новый объект не может заполнили EntityKey
(я знаю, что это не новая сущность, но для нового экземпляра контекста это так!).
Операции на основе
Add
всегда добавляют все неизвестные объекты в граф объектов. Сущность известна по контексту, только если тот же контекст загрузил сущность или если вы вызвали .Attach
для этой сущности.
Из-за этого это также неверно:
if (this.ParentCat != null)
{
if (this.ParentCat.CategoryID == 0)
context.AddToCats(this.ParentCat);
}
Неизвестный ParentCat
будет добавлен автоматически вместе с текущим Cat
. Если вы вызовете это, он также добавит текущий Cat
, но следующий вызов попытается добавить его снова => вы, вероятно, получите исключение.
Это целое может быть решено двумя способами:
- Загрузите
ParentCat
в тот же экземпляр контекста, что и вы, Cat
- Не загружайте
ParentCat
и не используйте фиктивный класс, или не пытайтесь установить EntityKey
Подход к манекену:
var parentCat = new Cat() { Id = 1 };
context.Cats.Attach(parentCat); // Use correct entity set name
var cat = new Cat()
{
CatName = "Test",
ParentCat = parentCat
};
cat.Save();
EntityKey
aproach (это больше похоже на предположение):
var cat = new Cat()
{
CatName = "Test",
// I hope ParentCatReference will be initialized
ParentCatReference.EntityKey = new EntityKey("Cats", "Id", 1) // Use correct entity set name
};
cat.Save();