【发布时间】: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