You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EF向SQLite插入数据时SaveChanges返回1,如何获取最新ID?

如何获取EF Core中SQLite自增实体的最新ID

你混淆了SaveChanges()的返回值含义——它返回的是本次操作受影响的数据库行数,不是实体的自增ID。在你的场景中,添加一条Person记录后返回1是正常的,因为只有1条数据被插入。

正确获取自增ID的方式是:调用SaveChanges()后,EF Core会自动将数据库生成的自增ID回填到你添加的person实体对象的主键属性(通常是Id)上,直接读取这个属性即可。

你的代码修改方案

把原来的:

_context.Persons.Add(person);
var personId = _context.SaveChanges();

改成:

_context.Persons.Add(person);
_context.SaveChanges();
var personId = person.Id; // 直接读取实体的Id属性

修改后的完整保存方法示例:

public bool SaveContact(PersonViewModel personViewModel, PhoneViewModel phoneViewModel, AddressViewModel addressViewModel)
{
    try
    {
        Person person = new Person();
        person.FirstName = personViewModel.FirstName;
        person.LastName = personViewModel.LastName;
        person.Email = personViewModel.Email;

        _context.Persons.Add(person);
        _context.SaveChanges();
        var personId = person.Id; // 获取真实的自增ID

        Phone phone = new Phone();
        phone.PersonId = personId;
        phone.PhoneTitle = phoneViewModel.PhoneTitle;
        phone.PhoneNumber = phoneViewModel.PhoneNumber;

        Address address = new Address();
        address.PersonId = personId;
        address.AddressTitle = addressViewModel.AddressTitle;
        address.AddressString = addressViewModel.AddressString;
        address.PostalCode = addressViewModel.PostalCode;

        _context.Phones.Add(phone);
        _context.Addresses.Add(address);
        _context.SaveChanges();

        return true;
    }
    catch (Exception ex)
    {
        // 建议添加日志记录,便于排查错误
        return false;
    }
}

额外优化建议

  1. 确保实体主键配置正确:EF Core默认会将名为Id或[类名]Id的int类型属性识别为自增主键。如果你的Person类主键不是这个命名,需要显式标注:
public class Person
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PersonId { get; set; } // 自定义主键名时需要标注
    // 其他属性...
}
  1. 合并SaveChanges调用:可以将所有实体添加操作放在一次SaveChanges()中,减少数据库交互次数,同时保证操作的事务性(要么全部成功,要么全部回滚):
public bool SaveContact(PersonViewModel personViewModel, PhoneViewModel phoneViewModel, AddressViewModel addressViewModel)
{
    try
    {
        Person person = new Person
        {
            FirstName = personViewModel.FirstName,
            LastName = personViewModel.LastName,
            Email = personViewModel.Email
        };

        // 直接关联实体,无需手动设置外键ID
        Phone phone = new Phone
        {
            Person = person,
            PhoneTitle = phoneViewModel.PhoneTitle,
            PhoneNumber = phoneViewModel.PhoneNumber
        };

        Address address = new Address
        {
            Person = person,
            AddressTitle = addressViewModel.AddressTitle,
            AddressString = addressViewModel.AddressString,
            PostalCode = addressViewModel.PostalCode
        };

        _context.Persons.Add(person);
        _context.Phones.Add(phone);
        _context.Addresses.Add(address);

        _context.SaveChanges(); // 一次保存所有实体

        return true;
    }
    catch (Exception ex)
    {
        // 记录日志
        return false;
    }
}

内容的提问来源于stack exchange,提问作者Abolfazl Davoodi Shandiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:50:42