【发布时间】:2016-11-06 16:12:06
【问题描述】:
使用 EF6 代码优先:
我的实体:
public class Symbol
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
public int Id
{
get; set;
}
public string Name { get; set; }
}
错误:
当 IDENTITY_INSERT 设置为 OFF 时,无法为表“符号”中的标识列插入显式值。
在谷歌上搜索问题时,常见的解决方案是设置DatabaseGeneratedOption.Identity。
现在我无法告诉数据库不要为我生成身份,这没有任何意义
它会导致奇怪的副作用。它正在生成一个运行的身份,从我离开的地方运行。即使我删除了表中的所有实体。
场景:
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:
完全删除数据库,然后用
设置它 [Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
成功了,问题是我在该数据库中获得了重要数据,并且不能在每次更改时丢弃它。为此,我在迁移后使用迁移,问题出现了。
编辑:
这似乎解释了问题
Migrations don't support identity change.
当我更改其身份设置时,可能已经定义了主键,然后取决于迁移。
故事的寓意。如果不删除创建或从链接进行自定义迁移,请确保您的身份在开始时。
【问题讨论】:
-
如果您的密钥不是由数据库生成的,那么您应该为该密钥提供一个值。
-
是的,我应该。我是。它给了我一个错误,您可以在上面的问题中显示“错误:”的部分下找到它
-
因此您还应该将表上的身份插入删除到数据库中。你如何生成表格?
-
这是EF代码。
-
尝试首先完全删除该数据库并从头开始生成。确保数据库不将 Id 列作为身份。
标签: c# entity-framework entity-framework-6