使用实体框架从数据库中获取标识列中最后自动插入的ID

发布于 2024-10-27 11:48:00 字数 366 浏览 1 评论 0原文

我使用下面的代码从数据库中获取自动标识列中新插入的 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(零)。

有没有其他方法可以使用实体框架获取最后插入的 ID?

谢谢...

I am using below code to get new inserted ID in auto identity column from database.

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

    Console.WriteLine(t2.ID);

}

It's working fine when I connect my application with MS Sql, but if I connect with Mysql, it always returns 0 (zero).

Is there any other way to get last inserted ID using Entity Framework?

Thanks...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

孤者何惧 2024-11-03 11:48:00

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

谢谢 :)

Finally I got soln. The table I was inserting row had only one column - 'ID' with auto identity = true. When I add one more nullable column with any name in table It's start working with my sql too!!! I think the problem is in my sql connector and not in entity framework.

Thanks :)

南薇 2024-11-03 11:48:00

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

在 Visual Studio 中打开实体模型图。
右键单击感兴趣的表并选择属性。
验证身份机制属性是否设置为 DatabaseServerCalculated。

I had to change the Identity Mechanism to get the ID of an inserted record after SaveChanges(). I'm using Visual Studio 2010 and the Telerik OpenAccess ORM.

Open the Entity Model diagram in Visual Studio.
Right-click on the table of interest and select Properties.
Verify the Identity Mechanism property is set to DatabaseServerCalculated.

皓月长歌 2024-11-03 11:48:00

我将该行调整为“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);
}

I adjusted the line to "entities.T2.Add(t2);" in Vatsal Desai's code and it works fine.

//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);
}
雪若未夕 2024-11-03 11:48:00

这是使用 SELECT LAST_INSERT_ID() 获取最后自动插入的 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

Here is another way to get last Auto inserted ID using SELECT LAST_INSERT_ID(); or SELECT SCOPE_IDENTITY();

for mySQL:

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

For SQLServer, using:

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
黎歌 2024-11-03 11:48:00

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

在 MySQL 中,您可以使用仅适用于 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; 

然后,如果您更改数据库后端,则可以更改该存储过程。
无需重写任何其他代码。

选择 GetLastID() 作为 Last_ID

In MySQL you can get the last inserted ID of an auto-increment field by using

For MySQL only

SELECT last_insert_id() as Last_ID

That will work assuming Entity Framework uses SQL to drive the MySQL database.
A simple test will answer that I guess.

Note that you will only get the last inserted ID from the current connection (which is usually what you want).
There is no way (that I know of) to get last inserted id of other connections, other than
doing a

SELECT MAX(id) FROM sometable as Last_ID

Which will work if the insert from the other connection has been committed.

Making it portable to other DB's
If you want to make this solution portable to other DB's you can make a stored function like so:

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

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

Then you can change that stored procedure should you change DB-backend.
With no need to rewrite any other code.

SELECT GetLastID() as Last_ID

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文