使用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; } }
额外优化建议
- 确保实体主键配置正确:EF Core默认会将名为
Id或[类名]Id的int类型属性识别为自增主键。如果你的Person类主键不是这个命名,需要显式标注:
public class Person { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int PersonId { get; set; } // 自定义主键名时需要标注 // 其他属性... }
- 合并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
相关产品推荐
相关产品推荐

