我正在使用實體框架6和SQLite數據庫(System.Data.SQLite.EF6),但我不能創建具有相同主鍵的條目在刪除之後立即進行。例如:實體框架6和SQLite - 不能創建條目刪除前條目PK
我的實體模型:
public class Person
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public int Name { get; set; }
}
步驟:
1)我插入這個實體PERSON1的實例(與ID = 1)進我的人表。
using (var context = new MyDbContext())
{
context.Create(person1);
await context.SaveChangesAsync();
}
2)Afters一些加餐我清除整個人表:
using (var context = new MyDbContext())
{
await context.Database.ExecuteSqlCommandAsync(string.Format("DELETE FROM `PersonModels`"));
await context.SaveChangesAsync();
}
3)I嘗試與相同的主鍵從第一步驟條目添加條目:PERSON2(具有ID = 1 )
using (var context = new MyDbContext())
{
context.Create(person2);
await context.SaveChangesAsync();
}
但在第三步驟中,SaveChangesAsync()
失敗
System.InvalidOperationException:成功提交對數據庫的更改,但更新對象上下文時發生錯誤。 ObjectContext可能處於不一致的狀態。內部異常消息:保存或接受更改失敗,因爲類型爲'DbModels.PersonModel'的多個實體具有相同的主鍵值。
當我添加收拾桌子(具有不同的主鍵),然後加入從第1步進入後一些其他的入口,它工作正常,這兩個項目都保存沒有例外。
我在創建新條目之前(在清除表之後)直接添加了斷點,並且通過外部工具檢查了Persons表,並且表爲空(因此沒有id = 1的條目)。
UPDATE: 擴展DbContexte +實現我的創建方法:
public DbSet<PersonModel> Persons { get; set; }
public T Create<T>(T entity)
where T : class
{
try
{
GetDbSetForType<T>().Add(entity);
return entity;
}
catch (Exception ex)
{
return default(T);
}
}
private DbSet<T> GetDbSetForType<T>()
where T : class
{
var type = typeof(T);
if (type == typeof(PersonModel)) return Persons as DbSet<T>;
//...my other types
throw new Exception("Type not found in db");
}
context.Create(person2) - 這是你自己的方法嗎?因爲我不記得EF有它。如果是這樣 - 你能展示它嗎? – Toddams
@Toddams哦,對不起,我將Create方法的主體添加到問題 –
如果從PersonModels中刪除所有條目,則可以使用它:'await context.Database.ExecuteSqlCommandAsync(string.Format(「TRUNCATE TABLE'PersonModels' 「));'這會對你有用嗎? – LocEngineer