【问题标题】:EF6 code first - Cannot insert explicit value for identity column in table '' when IDENTITY_INSERT is set to OFFEF6 代码优先 - 当 IDENTITY_INSERT 设置为 OFF 时,无法在表“”中插入标识列的显式值
【发布时间】: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. 现在我无法告诉数据库不要为我生成身份,这没有任何意义

  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:

完全删除数据库,然后用

设置它
          [Key]
          [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]

成功了,问题是我在该数据库中获得了重要数据,并且不能在每次更改时丢弃它。为此,我在迁移后使用迁移,问题出现了。

编辑:

这似乎解释了问题

Migrations don't support identity change.

当我更改其身份设置时,可能已经定义了主键,然后取决于迁移。

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

【问题讨论】:

  • 如果您的密钥不是由数据库生成的,那么您应该为该密钥提供一个值。
  • 是的,我应该。我是。它给了我一个错误,您可以在上面的问题中显示“错误:”的部分下找到它
  • 因此您还应该将表上的身份插入删除到数据库中。你如何生成表格?
  • 这是EF代码。
  • 尝试首先完全删除该数据库并从头开始生成。确保数据库将 Id 列作为身份。

标签: c# entity-framework entity-framework-6


【解决方案1】:

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

【讨论】:

  • 您能详细说明一下吗?这似乎是我正在尝试做的。我正在给我的钥匙赋值。由于身份插入问题,我无法插入它们。
猜你喜欢
  • 2012-09-12
  • 2012-09-30
  • 2016-05-13
  • 2016-08-18
  • 2019-03-10
  • 2010-11-22
  • 2011-08-26
相关资源
最近更新 更多