【发布时间】:2022-09-23 19:49:48
【问题描述】:
我有一个使用 sqlite 作为数据库的简单联系人应用程序。我首先使用 EF 代码来设计它的数据库。当我保存数据时,它的 Id 按预期在数据库中产生(自动增量),但是保存更改方法总是为 Id 返回 1。
如何获取最新的表 ID?
数据库上下文:
public class ApplicationDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
string dbPath = DbPathGenerator.GetDbPath();
options.UseSqlite($\"Data Source={dbPath}/LiteContactsDb.db\");
}
public DbSet<Person> Persons { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<Phone> Phones { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasMany<Address>()
.WithOne(a => a.Person)
.HasForeignKey(a => a.PersonId);
modelBuilder.Entity<Person>()
.HasMany<Phone>()
.WithOne(a => a.Person)
.HasForeignKey(a => a.PersonId);
base.OnModelCreating(modelBuilder);
}
}
保存方法:
public bool SaveContact(PersonViewModel personViewModel, PhoneViewModel phoneViewModel, AddressViewModel addressViewModel)
{
bool result = false;
try
{
Person person = new Person();
person.FirstName = personViewModel.FirstName;
person.LastName = personViewModel.LastName;
person.Email = personViewModel.Email;
_context.Persons.Add(person);
var personId = _context.SaveChanges();
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();
result = true;
}
catch (Exception ex)
{
result = false;
}
return result;
}
_context.SaveChanges();总是返回 1。
谢谢
-
SaveChanges 返回受影响的行数,而不是 Id。 Id 应该反映在实体本身上。
-
代码是错误的。
SaveChanges仍然存在全部待定更改并设置 ID全部新对象。只需创建对象并根据需要将它们分配给属性,然后只调用 .Add(person).英孚将插入全部相关实体 -
事实上,多次调用
SaveChanges是一个代码错误。 DbContext 是一个工作单元。它跟踪在其生命周期内所做的所有更改。如果您处置它,更改将丢失。SaveChanges应该只在最后一刻被调用才能坚持全部单个内部事务中的未决更改。这样,即使发生错误,更改也会“回滚”
标签: c# sqlite entity-framework