我使用下面的代码从数据库中获取自动标识列中的新插入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?
...谢谢
答案 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连接器而不是实体框架中。
谢谢:)