我有一個使用 sqllite 作為資料庫的簡單聯系人應用程式。我首先使用 EF 代碼來設計它的資料庫。當我保存資料時,它的 Id 按預期在資料庫中產生(自動增量),但SaveChanges方法總是為 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。
謝謝
uj5u.com熱心網友回復:
的回傳值SaveChanges不是新創建的記錄的id,而是改變的次數。因此,如果您插入單個專案,則回傳值將始終為 1。
如果要訪問新插入物件的 id,請查看物件的 id-property。它在插入后更新。
uj5u.com熱心網友回復:
首先,SaveChanges回傳受影響的行數,而不是存盤物件時生成的任何 ID。其次,SaveChanges持久化所有掛起的更改,而不僅僅是單個物件。
DbContext 是斷開連接的作業單元,而不是資料庫連接。在必須加載資料或保存更改之前,它甚至不會保持連接打開。SaveChanges被稱為持久化所有更改,而不僅僅是最新的。發生這種情況時,將打開一個新連接,并且所有更改都保存在單個內部事務中。
這意味著回滾作業單元不需要額外的努力——只是SaveChanges在處理 DbContext 之前不要呼叫。
最后,無需單獨添加物件。呼叫.Add(person)會將所有可通過它訪問的物件添加到Added狀態中。當更改持續存在時,DbContext 將以正確的順序執行 INSERT 操作并自動修復 FK 屬性。
這意味著在一個一致的“事務”中添加一個人、電話和地址只需要這個:
var person = new Person {
FirstName = personViewModel.FirstName,
LastName = personViewModel.LastName,
Email = personViewModel.Email
Phone = new Phone {
PhoneTitle = phoneViewModel.PhoneTitle,
PhoneNumber = phoneViewModel.PhoneNumber
},
Address = new Address {
AddressTitle = addressViewModel.AddressTitle,
AddressString = addressViewModel.AddressString,
PostalCode = addressViewModel.PostalCode
}
}
_context.Persons.Add(person);
...
_context.SaveChanges();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510187.html
標籤:C#sqlite实体框架
上一篇:引數的型別不受支持
