2016-11-06 52 views
2

使用EF6代碼優先:EF6代碼第一 - 不能爲表 '' 標識列插入顯式值時IDENTITY_INSERT設置爲OFF

我的實體:

public class Symbol 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)] 
    public int Id 
    { 
     get; set; 
    } 

    public string Name { get; set; } 
} 

錯誤:

當IDENTITY_INSERT設置爲OFF時,無法在表'符號'中爲標識列插入顯式值。

這個問題的常見解決方案是設置DatabaseGeneratedOption.Identity

  1. 這沒有任何意義,現在我不能告訴DB不產生對我

  2. 身份它導致一個奇怪的副作用。它正在生成一個正在運行的身份,從我離開的地方開始運行。即使我刪除了表中的所有實體。

場景:

1) inserting { 44, "s1"} , { 55, "s2"} , { 52, "s3"}   
     In DB : {1,"s1"} {2,"s2"} {3,"s3"} 
    2) delete all symbols 
    3) inserting { 44, "s1"} , { 55, "s2"} , { 52, "s3"}   
     In DB : {4,"s1"} {5,"s2"} {6,"s3"} 

如果我設置標識每次插入之前,插入上我猜測,這可能工作。

Like in this answer only on each insert

是否有任何內置的方式插入具有設置標識插入上手動各插入了身份?

編輯:

我也試過一些通過鏈接的啓發以上:

public void InsertRange(IEnumerable<TEntity> entities) 
    { 
     _context.IdentityInsert<TEntity>(true); 

     _dbSet.AddRange(entities); 
     _context.SaveChanges(); 

     _context.IdentityInsert<TEntity>(false); 
    } 


    public static string GetTableName<T>(this DbContext context) where T : class 
    { 
     ObjectContext objectContext = ((IObjectContextAdapter) context).ObjectContext; 
     return objectContext.GetTableName<T>(); 
    } 

    public static string GetTableName<T>(this ObjectContext context) where T : class 
    { 
     string sql = context.CreateObjectSet<T>().ToTraceString(); 
     Regex regex = new Regex(@"FROM\s+(?<table>.+)\s+AS"); 
     Match match = regex.Match(sql); 

     string table = match.Groups["table"].Value; 
     return table; 
    } 

    public static void IdentityInsert<T>(this DbContext context ,bool on) where T : class 
    { 
     if (on) 
     { 
      context.Database.ExecuteSqlCommand(string.Concat(@"SET IDENTITY_INSERT ", context.GetTableName<T>(), @" ON")); 
     } 
     else 
     { 
      context.Database.ExecuteSqlCommand(string.Concat(@"SET IDENTITY_INSERT ", context.GetTableName<T>(), @" OFF")); 
     } 
    } 

它沒有工作

編輯2:

好滴速的DB完全然後將其設置爲

  [Key] 
      [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)] 

做了詭計,事情是我得到了該數據庫中的重要數據,不能在每次更改時放棄它。爲此,我在遷移後使用遷移問題出現了。

編輯:

這似乎可以解釋這個問題

Migrations don't support identity change.

大概面前的主鍵定義,然後根據遷移時,我改變其身份設置不起作用。

故事的寓意。如果不刪除創建或從鏈接執行自定義遷移,請在開始時確保您的身份。

+0

如果您的密鑰不是生成數據庫,那麼您應該爲該密鑰提供一個值。 – CodeNotFound

+0

是的,我應該。 而我。它給了我一個錯誤 你可以說這部分下找到它:在上面 –

+0

問題所以你也應該刪除身份插入在桌子上爲數據庫 「ERROR」。你如何生成表格? – CodeNotFound

回答

0

關閉數據庫中的身份並管理您的代碼中的鍵值... 這是最好的方法

+0

能否詳細說明? 這看起來就像我試圖做的那樣 我正在給我的鍵值,我不能由於身份插入問題而插入它們。 –

相關問題