2015-10-19 60 views
6

我正在使用實體框架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"); 
    }  
+0

context.Create(person2) - 這是你自己的方法嗎?因爲我不記得EF有它。如果是這樣 - 你能展示它嗎? – Toddams

+0

@Toddams哦,對不起,我將Create方法的主體添加到問題 –

+0

如果從PersonModels中刪除所有條目,則可以使用它:'await context.Database.ExecuteSqlCommandAsync(string.Format(「TRUNCATE TABLE'PersonModels' 「));'這會對你有用嗎? – LocEngineer

回答

0

EF數據庫環境中保持它在內存中,直到它被摧毀或卸載數據庫檢索對象的列表。

using (var ctx = new MyDbContext()) 
{ 
    var person1 = new Person { Id = 1 }; 
    ctx.Persons.Add(person1); 
    await ctx.SaveChangesAsync(); 

    await context.Database.ExecuteSqlCommandAsync(string.Format("DELETE FROM `PersonModels`")); 

    // This is the secret 
    ((IObjectContextAdapter)ctx).ObjectContext.Detach(person1); 

    ctx.Persons.Add(person1) 
    await ctx.SaveChangesAsync(); 

} 
+0

謝謝,但我使用單獨的上下文(在我清除Persons表後,我處理上下文並創建用於添加條目的上下文的新實例)。另外,我的((IObjectContextAdapter)ctx).ObjectContext不包含「Persons」(我在我的DbContext實現中只有Persons屬性 - >'DbSet Persons',但DbSet沒有Detach()。) –

+0

絕對不能在你描述的情況下重現問題。我還更新了'Detach'代碼示例。 –