【问题标题】:In ASP.NET CORE application EF Core library do not return new inserted record's ID from database?在 ASP.NET CORE 应用程序中,EF Core 库不从数据库返回新插入记录的 ID?
【发布时间】:2023-03-26 20:07:01
【问题描述】:

我有 asp.net webapi 项目,其中以下查询工作正常 即向数据库中添加数据并在_context.SaveChanges()之后返回新添加的ID

我正在使用 MYSQL 数据库。它也必须在 MYSQL 中工作:(

但是当我迁移 asp.net webapi code to asp.net CORE using EF CORE 新记录成功插入数据库但在 _context.SaveChanges() 之后它返回 0 作为 newId 而不是 new Id。

public partial class Student
    {
        public int Id { get; set; }
        public string name { get; set; }
       }


Student student = new Student()
student.name = "test";

_context.Add(student);
_context.SaveChanges()

int newID = student.Id ; 

//在asp.net webapi中得到了自动生成的Id,但在asp.net core项目中为0。

有什么线索吗?

【问题讨论】:

  • 请附上Student的源代码。
  • 添加到问题中请检查
  • Student 实体的主键是什么?如果你什么都不说,它将是Id,但从你得到的错误来看,它可能是name 属性吗?您可以通过在ConfigureServices 中调用AddConsoleAddDebug 来观察日志。
  • 主键是Id,这是自动生成的字段。没有错误,但唯一的问题是当我将 asp.net core 与 EF core 一起使用时,我没有得到新插入的 Id
  • 我也有同样的问题。我正在使用带有 MariaDB 数据库的 ASP NET CORE 2 和 EF 2。连接器是 Pomelo 2.0 版。

标签: c# mysql asp.net entity-framework asp.net-web-api


【解决方案1】:

对于我来说,无论是 EF Core 1.2 还是 2.0,这都无法重现。

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;

namespace ConsoleApp8
{

    public partial class Student
    {
        public int Id { get; set; }
        public string name { get; set; }
    }



    public class Db : DbContext
    {
        public DbSet<Student> Students { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=localhost;database=EfCoreTest;Integrated Security=true;MultipleActiveResultsets=false");
            base.OnConfiguring(optionsBuilder);
        }

    }
    class Program
    {

        static void Main(string[] args)
        {            

            using (var db = new Db())
            {
                db.Database.EnsureDeleted();
                db.Database.EnsureCreated();

                Student student = new Student();
                student.name = "test";

                db.Add(student);
                db.SaveChanges();

                int newID = student.Id;
                Console.WriteLine($"NewID {newID}");
            }
            Console.WriteLine("Hit any key to exit.");
            Console.ReadKey();


        }
    }
}

【讨论】:

  • 我正在使用 MYSQL 数据库。它也必须在 MYSQL 中工作 :( – Neo 1 小时前
  • 我对 MySQL 一无所知。这个再现不适用于 MySQL 吗?
  • 它工作得很好,记录也被添加到数据库表中,但在 db.SaveChanges() 之后总是将 Id 设为 0; int newID = student.Id;不知道为什么:(
【解决方案2】:

我也有同样的问题。就我而言,我首先使用了数据库。 我的脚手架被标记为使用数据注释。

dotnet ef dbcontext scaffold "Host=localhost;Port=3306;Database=dbtest;Usernt=root;Password=mypass" -o "Entities" Pomelo.EntityFrameworkCore.MySql -c "DatabaseRepository" -f -d

即使标记为“数据注释”,也会在上下文中的 onModelCreate 方法中生成一些 FluentAPI 脚本。

modelBuilder.Entity<MyEntity>(entity =>
        //{
        //    entity.Property(e => e.Id).ValueGeneratedNever();
        //});

验证您是否有类似的代码,即在 Id 属性中设置 ValueGeneratedNever。更改为 ValueGeneratedOnAdd

我如何使用数据注释而不是 FluentAPI,我删除了 onModelCreate 方法中的代码。

使用这两个选项之一,应该可以工作。

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多