使用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
。
這沒有任何意義,現在我不能告訴DB不產生對我
身份它導致一個奇怪的副作用。它正在生成一個正在運行的身份,從我離開的地方開始運行。即使我刪除了表中的所有實體。
場景:
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.
大概面前的主鍵定義,然後根據遷移時,我改變其身份設置不起作用。
故事的寓意。如果不刪除創建或從鏈接執行自定義遷移,請在開始時確保您的身份。
如果您的密鑰不是生成數據庫,那麼您應該爲該密鑰提供一個值。 – CodeNotFound
是的,我應該。 而我。它給了我一個錯誤 你可以說這部分下找到它:在上面 –
問題所以你也應該刪除身份插入在桌子上爲數據庫 「ERROR」。你如何生成表格? – CodeNotFound