Как получить идентификатор объекта после вызова SaveChanges (), когда объект отображается в хранимых процедурах - PullRequest
5 голосов
/ 11 октября 2011

Мы используем Entity Framework 4.0, и у нас есть объект, который сопоставлен с хранимыми процедурами, предоставленными нашим администратором базы данных.Все функции вставки, обновления и удаления в деталях сопоставления имеют свои собственные хранимые процедуры.

При использовании сущностей, сопоставленных с таблицами, я могу добавить новую сущность, вызвать dataContext.SaveChanges();, а затем новуюДля экземпляра, созданного мною, автоматически присваивается его свойство ID со значением из столбца идентификаторов в базе данных.

Как это можно сделать, когда сущность сопоставляется с хранимыми процедурами?Должна ли хранимая процедура INSERT делать что-то особенное и / или я должен делать что-то особенное для dataContext.SaveChanges();?

Пример

Традиционный способ

var newCustomer = new Customer
{
    Name = "Fred",
    Age = 24
};

// newCustomer.Id is null

dataContext.Customers.Add(newCustomer);
dataContext.SaveChanges()

// newCustomer.Id is what database identity column was set to.

Mappedк хранимым процедурам.

var newCustomer = new Customer
{
    Name = "Fred",
    Age = 24
};

// newCustomer.Id is null

dataContext.Customers.Add(newCustomer);
dataContext.SaveChanges()

// newCustomer.Id is null

Ответы [ 2 ]

9 голосов
/ 11 октября 2011

Если вы используете столбец Identity в базе данных, убедитесь, что ваша хранимая процедура содержит:

SELECT Scope_Identity() AS Id

после вызова INSERT

Также убедитесь, что PK в вашем режиме сущности правильнос настройкой StoreGeneratedPattern, установленной на Identity (должно быть автоматически, если вы использовали Обновление из базы данных )

1 голос
/ 11 октября 2011

Я считаю, что вашей БД необходимо использовать @@identity или вставить с NewID() и вернуть вам значение Identity / NewID обратно через хранимую процедуру. Технически вы можете выбрать из базы данных для вставленной вами записи, но это очень сомнительный способ сделать это; вы не знаете, были ли вставлены записи (если только SP не удалось установить в .Net), вы можете не знать, существуют ли дублированные записи или даже если данные были изменены после вставки, но до выбора. Если вы сомневаетесь, я всегда настоятельно рекомендую поговорить с вашим администратором баз данных о наилучшем подходе к вашим конкретным потребностям на основе вашего дизайна администраторов баз данных.

Обновление:

Если он вернет вам значение PK, вы сможете сделать стандартный выбор из таблицы, чтобы заполнить сущность, например from e in context.entities where e.pkcolumn = spkeyreturned select e.

Если он вернет вам ВСЕ данные обратно и сможет гарантировать, что данные не изменятся, вы сможете создать новую сущность, заполнить ее всеми данными и использовать метод Attach. Лично я бы этого не сделал, но это вариант. Присоединение и отсоединение объекта в Entity Framework .

...