【问题标题】:SqlException: Cannot insert explicit value for identity column in table '' when IDENTITY_INSERT is set to OFFSqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法为表“”中的标识列插入显式值
【发布时间】:2018-06-29 13:10:45
【问题描述】:

使用以下代码,我收到错误消息,指出我需要将 [Tournaments].[Tournaments] 和 [Games].[Game] 的身份插入设置为 ON

 if (!context.Items.Any())
        {
            context.Database.OpenConnection();
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Items].[Items] ON;");
            Tournament Tournament = _tournamentDbContext.Tournaments.Where(x => x.Id == 1).First();
            Game _Game = _gameDbContext.Games.Where(x => x.Id == 1).First();
            ItemType ItemType = context.ItemTypes.Where(x => x.Id == 1).First();
            Item item = new Models.Items.Item
            {
                Id = 1,
                Name = "Test",
                ItemType = ItemType,
                Price = 100,
                Short_Description = "TestShort",
                Tournament = Tournament,
                Game = _Game,
                DateCreated = DateTime.Now
            };
            context.Items.Add(item);
            context.SaveChanges();
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Items].[Items] OFF;");
            context.Database.CloseConnection();
        }

如果我添加设置两个 identity_inserts 的代码:

  if (!context.Items.Any())
        {
            context.Database.OpenConnection();
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Items].[Items] ON;");
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Tournaments].[Tournaments] ON;");
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Game].[Games] ON;");
            Tournament Tournament = _tournamentDbContext.Tournaments.Where(x => x.Id == 1).First();
            Game _Game = _gameDbContext.Games.Where(x => x.Id == 1).First();
            ItemType ItemType = context.ItemTypes.Where(x => x.Id == 1).First();
            Item item = new Models.Items.Item
            {
                Id = 1,
                Name = "Test",
                ItemType = ItemType,
                Price = 100,
                Short_Description = "TestShort",
                Tournament = Tournament,
                Game = _Game,
                DateCreated = DateTime.Now
            };
            context.Items.Add(item);
            context.SaveChanges();
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Items].[Items] OFF;");
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Tournaments].[Tournaments] OFF;");
            context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [Game].[Games] OFF;");
            context.Database.CloseConnection();
        }

错误,System.Data.SqlClient.SqlException: 'IDENTITY_INSERT is already ON for table 'aspnet-SpidShop-FA900737-72CD-4ABA-BDEF-598D51CB5A43.Items.Items'. Cannot perform SET operation for table 'Tournaments.Tournaments'.'

我不知道该怎么做,因为我什至不改变锦标赛和游戏桌,只改变项目。知道如何解决这个问题吗?

更新:

我通过删除所有迁移,禁用初始化方法,然后重做迁移解决了身份插入问题。

我面临另一个问题:

if (!context.Items.Any())
        {
            Tournament Tournament = _tournamentDbContext.Tournaments.Where(x => x.Id == 1).First();
            Game Game = _gameDbContext.Games.Where(x => x.Id == 1).First();
            ItemType ItemType = context.ItemTypes.Where(x => x.Id == 1).First();
            Item item = new Models.Items.Item
            {
                Name = "Test",
                ItemType = ItemType,
                Price = 100,
                Short_Description = "TestShort",
                Tournament = Tournament,
                Game = Game,
                DateCreated = DateTime.Now
            };
            context.Items.Add(item);
            context.SaveChanges();
        }

最后一行抛出SqlException: Invalid object name 'Game'.

型号:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Short_Description { get; set; }
    public decimal Price { get; set; }
    public ItemType ItemType { get; set; }
    public Tournament Tournament { get; set; }
    public Game Game { get; set; }
    [DataType(DataType.Date)]
    public DateTime DateCreated { get; set; }
}

还有我的背景

 public class ItemDbContext : DbContext
{
    private string Schema = "Items";
    public ItemDbContext(DbContextOptions<ItemDbContext> options) : base(options)
    {
    }

    public DbSet<Item> Items { get; set; }
    public DbSet<ItemType> ItemTypes { get; set; }
    public DbSet<ItemTag> ItemTags { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Item>().ToTable("Item", Schema);
        modelBuilder.Entity<ItemType>().ToTable("ItemType", Schema);
        modelBuilder.Entity<ItemTag>().ToTable("ItemTag", Schema);
    }

}

游戏不为空,并且匹配正确。

【问题讨论】:

  • 首先决定您是否希望数据库生成密钥,或者您的 .NET 代码是否应该生成密钥,然后调整您的问题。如果您想自己设置键,那么在表中配置标识列是没有意义的。
  • 是的,我希望自动生成密钥。我自己在这里设置它们,因为它是种子方法。即使我删除“Id = 1”,它也会引发同样的错误。
  • 我删除了“Id = 1”,并删除了这 3 个表的 IDENTITIY_INSERT ON。我仍然遇到同样的错误。
  • SET IDENTITY_INSERT 一次只能对一个表有效
  • 这是有道理的。我删除了所有这些。即使我没有在锦标赛或游戏中插入任何内容,我仍然会遇到同样的错误。错误弹出是 SaveChanges()。你能检查一下编辑过的问题吗?

标签: c# entity-framework .net-core


【解决方案1】:

我有多个上下文,我将所有内容放在一个中,并删除了 ID,因为它们应该是自动生成的。

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2019-11-11
    • 1970-01-01
    • 2016-05-13
    • 2019-03-10
    • 2020-03-09
    • 2016-08-18
    相关资源
    最近更新 更多