gpt4 book ai didi

c# - EF6 代码优先 - 当 IDENTITY_INSERT 设置为 OFF 时,无法在表 '' 中插入标识列的显式值

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:13 25 4
gpt4 key购买 nike

首先使用 EF6 代码:

我的实体:

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

public string Name { get; set; }
}

错误:

Cannot insert explicit value for identity column in table 'Symbols' when IDENTITY_INSERT is set to OFF.

在谷歌搜索问题时,常见的解决方案是设置 DatabaseGeneratedOption.Identity

  1. 现在这没有意义,因为我不能告诉数据库不要为我生成身份

  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"}

我猜如果我在每次插入之前设置 Identity insert on,这可能会起作用。

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.

可能之前定义了主键,然后在我更改其身份设置时取决于迁移不起作用。

故事的寓意。如果不删除创建或从链接进行自定义迁移,请确保一开始就确定您的身份。

最佳答案

关闭数据库中的身份并在您的代码中管理您的键值....这是最好的方法

关于c# - EF6 代码优先 - 当 IDENTITY_INSERT 设置为 OFF 时,无法在表 '' 中插入标识列的显式值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40451498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com