Получить последний автоматически вставленный идентификатор в столбце идентификаторов из БД с использованием Entity Framework - PullRequest
4 голосов
/ 28 марта 2011

Я использую приведенный ниже код для получения нового вставленного идентификатора в столбце автоидентификации из базы данных.

using (TestEntities entities = new TestEntities())
{
    T2 t2 = new T2();
    t2.Value = "some value";
    entities.AddToT2(t2);
    entities.SaveChanges();

    Console.WriteLine(t2.ID);

}

Работает нормально, когда я подключаю свое приложение к MS Sql, но если я подключаюсь с Mysql, он всегдавозвращает 0 (ноль).

Есть ли другой способ получить последний вставленный идентификатор с помощью Entity Framework?

Спасибо ...

Ответы [ 5 ]

1 голос
/ 29 октября 2018

Я изменил строку на "entity.T2.Add (t2);"в коде Ватсаля Десаи, и он работает нормально.

//Version Info.:
//EntityFramework (Microsoft) Version=6.2.0 
//MySQL.Data (Oracle) v8.0.12
//MySQL.Data.EntityFramework (Oracle) v.8.0.12

using (TestEntities entities = new TestEntities())
{
    T2 t2 = new T2();
    t2.Value = "some value";

    entities.T2.Add(t2);

    entities.SaveChanges();

    Console.WriteLine(t2.ID);
}
1 голос
/ 26 октября 2018

Вот еще один способ получить последний автоматически вставленный идентификатор, используя SELECT LAST_INSERT_ID (); или ВЫБЕРИТЕ SCOPE_IDENTITY ();

для MySQL:

var sql = "Insert t2(item) Values (value); SELECT LAST_INSERT_ID(); ";
int ID = entities.Database.SqlQuery<int>(sql).Single();

Для SQLServer, используйте:

var sql = "Insert t2(item) Values (value); SELECT SCOPE_IDENTITY(); ";  
int ID = entities.Database.SqlQuery<int>(sql).Single();

//Version Info.:
//EntityFramework (Microsoft) Version=6.2.0 
//MySQL.Data (Oracle) v8.0.12
//MySQL.Data.EntityFramework (Oracle) v.8.0.12
1 голос
/ 12 июня 2012

Мне пришлось изменить механизм идентификации, чтобы получить идентификатор вставленной записи после SaveChanges (). Я использую Visual Studio 2010 и Telerik OpenAccess ORM.

Откройте диаграмму Entity Model в Visual Studio. Щелкните правой кнопкой мыши по интересующей таблице и выберите «Свойства». Убедитесь, что для свойства Identity Mechanism установлено значение DatabaseServerCalculated.

0 голосов
/ 22 февраля 2012

Наконец-то я получил солнеч.В таблице, в которую я вставлял строку, был только один столбец - 'ID' с автоматической идентификацией = true.Когда я добавляю в таблицу еще один столбец с любым именем, он тоже начинает работать с моим sql !!!Я думаю, что проблема в моем коннекторе sql, а не в рамках структуры.

Спасибо:)

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

В MySQL вы можете получить последний вставленный идентификатор поля автоинкремента, используя

Только для MySQL

SELECT last_insert_id() as Last_ID

Это будет работать при условии, что Entity Framework использует SQL для управления базой данных MySQL.
Простой тест даст ответ, который я предполагаю.

Обратите внимание, что вы получите только последний вставленный идентификатор из текущего соединения (обычно это то, что вам нужно).
Нет способа (о котором я знаю) получить последний вставленный идентификатор других подключений, кроме

SELECT MAX(id) FROM sometable as Last_ID

, который будет работать, есливставка из другого соединения была зафиксирована.

Делаем его переносимым на другие БД
Если вы хотите сделать это решение переносимым на другие БД, вы можетеСоздайте хранимую функцию следующим образом:

CREATE FUNCTION GetLastID: integer; 
BEGIN 
  DECLARE lastid: integer; 

  SELECT last_insert_id() INTO lastid; 
  RETURN lastid; 
END; 

Затем вы можете изменить эту хранимую процедуру, если вы измените DB-backend.
Без необходимости перезаписывать любой другой код.

SELECT GetLastID() как Last_ID

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