从DB Using Entity Framework获取标识列中的最后一个自动插入ID

时间:2011-03-28 14:44:28

标签: mysql entity-framework identity

我使用下面的代码从数据库中获取自动标识列中的新插入ID。

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获取最后插入的ID?

...谢谢

5 个答案:

答案 0 :(得分:1)

我必须更改Identity Mechanism才能在SaveChanges()之后获取插入记录的ID。我正在使用Visual Studio 2010和Telerik OpenAccess ORM。

在Visual Studio中打开实体模型图。 右键单击感兴趣的表,然后选择“属性”。 验证Identity Mechanism属性是否设置为DatabaseServerCalculated。

答案 1 :(得分:1)

这是使用SELECT LAST_INSERT_ID();获取最后一个自动插入的ID的另一种方法。或SELECT 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

答案 2 :(得分:1)

我将行调整为“ entities.T2.Add(t2);”在Vatsal Desai的代码中,效果很好。

//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);
}

答案 3 :(得分:0)

在MySQL中,您可以使用

获取自动增量字段的最后插入ID

仅限MySQL

SELECT last_insert_id() as Last_ID

这将有效假设实体框架使用SQL来驱动MySQL数据库 我想这是一个简单的测试。

请注意,您只能从当前连接获取最后插入的ID(通常是您想要的)。
除了之外,没有办法(我知道)获得其他连接的最后插入ID 做一个

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,则可以更改该存储过程 无需重写任何其他代码。

选择GetLastID()作为Last_ID

答案 4 :(得分:0)

最后我得到了解决方案。我插入行的表只有一列 - 'ID',auto identity = true。当我在表中添加一个带有任何名称的可空列时,它也开始使用我的sql !!!我认为问题出在我的sql连接器而不是实体框架中。

谢谢:)