EF не обновляет первичный ключ объекта, недавно добавленного в базу данных - PullRequest
5 голосов
/ 11 апреля 2011

У меня есть таблица "JobOrder", которая добавляется в базу данных с помощью обычного вызова EF.
В моей базе данных у меня Job_Id как первичный ключ и значение автоинкремента , поэтому мне не нужночтобы установить, какая модель EF по умолчанию имеет значение 0.
Но мне нужен идентификатор Job_Id, который был вставлен в базу данных после того, как я вызвал SaveChanges ().
Я пытался использовать Refresh (), но он не работал, Job_Id для вновь вставленного объекта был все еще 0.

using (ObjContext context = new ObjContext())  
{  
    context.AddToJobOrder(order);  
    context.SaveChanges();
    context.Refresh(RefreshMode.StoreWins, order);             //TRIED THIS  
    context.Refresh(RefreshMode.StoreWins, context.JobOrder);  //TRIED THIS TOO  
}

Я попробовал оба вызова, как упомянуто выше, но все же я получил Job_Id равным 0.
Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 11 апреля 2011

Когда вы добавляете объект в контекст, и SaveChanges() он должен правильно заполнять поле идентификатора.

Так что попробуйте это, установите точку останова, и вы увидите, что идентификатор первичного ключа установлен правильно.

using (ObjContext context = new ObjContext())  
{  
    context.AddToJobOrder(order);  
    context.SaveChanges();

    //Breakpoint here, and see that Job_id has been populated.
    Debug.WriteLine(order.Jod_id);
}

Только после .SaveChanges устанавливается первичный ключ, поскольку он должен перейти в базу данных и найти следующее числовое значение.

1 голос
/ 11 апреля 2011

В нормальной ситуации вам не нужен метод Refresh.После context.SaveChanges() этот вновь введенный ордер должен иметь свой order.Job_id.Конечно, если у вас есть база данных MSSQL. В других случаях в поставщиках могут быть некоторые невыполненные вещи, хотя на данный момент почти все крупные поставщики БД имеют как минимум нормальные бета-версии поставщиков БД с поддержкой общих функций EF.
PSмного похожих вопросов по сети и переполнению стека. См., например, this .

0 голосов
/ 12 апреля 2011

Убедитесь, что для свойства StoreGeneratedPattern установлено значение Identity в и в CSDL и SSDL. Дизайнер показывает только свойство CSDL, поэтому вам может потребоваться открыть его в редакторе XML, чтобы просмотреть и отредактировать SSDL, или использовать инструмент синхронизации (например, моя надстройка модель компаратор для EF4) для синхронизации DB / SSDL / CSDL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...