Исключение при сохранении объекта со связанным объектом EF 3.5 - PullRequest
0 голосов
/ 05 июня 2011

Я получаю сообщение об ошибке, сообщающее, что: «Свойство EntityKey можно установить только в том случае, если текущее значение свойства равно нулю». когда я пытаюсь сохранить объект со связанным объектом. Вот мой код:

public partial class Cat{
    public bool Save()
    {
        try
        {
            using (var context = new PhonebookEntities())
            {
                if (this.ParentCat != null)
                {
                    if (this.ParentCat.CategoryID == 0)
                        context.AddToCats(this.ParentCat);
                }
                context.AddToCats(this);
                context.SaveChanges();
            }
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
}

И здесь я создаю объект Cat, подключаю его к родительскому объекту Cat и затем вызываю метод save:

        var cat = new Cat()
        {
            CatName = "Test",
            ParentCat = Cat.GetById(1)
        };
        cat.Save();

1 Ответ

1 голос
/ 05 июня 2011

Дай угадаю - 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...