sqlite 使用EF插入到SqlLite数据库的ID始终返回1

zed5wv10  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(405)

我有一个简单的联系应用程序,使用SQLLITE作为数据库。我首先使用EF代码来设计它的数据库。当我保存数据时,它的ID如期在数据库中产生(Auto Increment),但SaveChanges方法总是为ID返回1。
我如何才能获得最新的表ID?
DbContext:

  1. public class ApplicationDbContext : DbContext
  2. {
  3. protected override void OnConfiguring(DbContextOptionsBuilder options)
  4. {
  5. string dbPath = DbPathGenerator.GetDbPath();
  6. options.UseSqlite($"Data Source={dbPath}/LiteContactsDb.db");
  7. }
  8. public DbSet<Person> Persons { get; set; }
  9. public DbSet<Address> Addresses { get; set; }
  10. public DbSet<Phone> Phones { get; set; }
  11. protected override void OnModelCreating(ModelBuilder modelBuilder)
  12. {
  13. modelBuilder.Entity<Person>()
  14. .HasMany<Address>()
  15. .WithOne(a => a.Person)
  16. .HasForeignKey(a => a.PersonId);
  17. modelBuilder.Entity<Person>()
  18. .HasMany<Phone>()
  19. .WithOne(a => a.Person)
  20. .HasForeignKey(a => a.PersonId);
  21. base.OnModelCreating(modelBuilder);
  22. }
  23. }

保存方法:

  1. public bool SaveContact(PersonViewModel personViewModel, PhoneViewModel phoneViewModel, AddressViewModel addressViewModel)
  2. {
  3. bool result = false;
  4. try
  5. {
  6. Person person = new Person();
  7. person.FirstName = personViewModel.FirstName;
  8. person.LastName = personViewModel.LastName;
  9. person.Email = personViewModel.Email;
  10. _context.Persons.Add(person);
  11. var personId = _context.SaveChanges();
  12. Phone phone = new Phone();
  13. phone.PersonId = personId;
  14. phone.PhoneTitle = phoneViewModel.PhoneTitle;
  15. phone.PhoneNumber = phoneViewModel.PhoneNumber;
  16. Address address = new Address();
  17. address.PersonId = personId;
  18. address.AddressTitle = addressViewModel.AddressTitle;
  19. address.AddressString = addressViewModel.AddressString;
  20. address.PostalCode = addressViewModel.PostalCode;
  21. _context.Phones.Add(phone);
  22. _context.Addresses.Add(address);
  23. _context.SaveChanges();
  24. result = true;
  25. }
  26. catch (Exception ex)
  27. {
  28. result = false;
  29. }
  30. return result;
  31. }

**_context.SaveChanges();**始终返回1。

谢谢

u3r8eeie

u3r8eeie1#

SaveChanges的返回值不是新创建的记录的ID,而是更改的次数。因此,如果您插入单个项,则返回值始终为1。
如果您想要访问新插入的对象的id,请检查该对象的id属性。它在插入后更新。

56lgkhnf

56lgkhnf2#

首先,SaveChanges返回受影响的行数,而不是存储对象时生成的任何ID。其次,SaveChanges持久化所有挂起的更改,而不仅仅是单个对象。
DbContext是断开连接的工作单元,而不是数据库连接。在必须加载数据或保存更改之前,它甚至不会保持连接打开。SaveChanges被调用来持久化所有更改,而不仅仅是最新的更改。当发生这种情况时,将打开一个新连接,并且所有更改都保存在单个内部事务中。
这意味着回滚工作单元不需要额外的工作--只是在处理DbContext之前不要调用SaveChanges
最后,不需要单独添加对象。调用.Add(person)会将所有可通过它访问的对象添加到Added状态。当更改被保留时,DbContext将以正确的顺序执行插入操作,并自动修复FK属性。
这意味着在单个一致的“事务”中添加一个人、电话和地址只需要:

  1. var person = new Person {
  2. FirstName = personViewModel.FirstName,
  3. LastName = personViewModel.LastName,
  4. Email = personViewModel.Email
  5. Phone = new Phone {
  6. PhoneTitle = phoneViewModel.PhoneTitle,
  7. PhoneNumber = phoneViewModel.PhoneNumber
  8. },
  9. Address = new Address {
  10. AddressTitle = addressViewModel.AddressTitle,
  11. AddressString = addressViewModel.AddressString,
  12. PostalCode = addressViewModel.PostalCode
  13. }
  14. }
  15. _context.Persons.Add(person);
  16. ...
  17. _context.SaveChanges();
展开查看全部

相关问题