我正在尝试创建一个“订单”对象,该对象的“ OrderItem”集合包含一个“ Hamper”对象。基本上,每当我尝试将“ Order”对象保存到数据库中时,我都会不断收到这样的错误消息:我无法为我的礼物篮插入显式值,除非我没有更改礼物篮数据,我只是在另一个对象中使用这些对象。 我的礼物篮模型有:
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
在主键对象之前。我不知道该怎么做才能说实话,我在网上发现的任何内容似乎也无济于事。无论我是要一个接一个地添加“ OrderItem”对象,还是要在“ Order”对象中添加整个集合,我仍然无法摆脱这个错误。我已经在'OrderItem'中将HamperID链接为前键,并且在将对象保存到其他对象中时没有出现这个问题,这只是这个示例。 无论如何,这是错误。我不希望包括这些模型会有很大帮助,但是具体错误如下:
Inner Exception 1:
SqlException: Cannot insert explicit value for identity column in table
'TblHamper' when IDENTITY_INSERT is set to OFF.
这是“ OrderItem”模型,每次我尝试保存时都会引起错误:
[Key]
public int Id { get; set; }
public Hamper Hamper { get; set; }
public int Quantity { get; set; }
[ForeignKey("HamperID")]
public int HamperID { get; set; }
答案 0 :(得分:0)
由EF Core
控制Tracking
决定是否更新或创建。对于您的情况,似乎在使用新的Hamper
创建新的Order
时初始化了一个新的OrderItem
。
尝试以下选项:
在数据库中用Hamper
重置Hamper
。
Hamper hamper = new Hamper { Id = 1, Name = "H1" };
Hamper dbHamper = _context.Hamper.FirstOrDefault(h => h.Id == hamper.Id);
OrderItem orderItem = new OrderItem { Title = "T1", HamperId = dbHamper.Id, Hamper = dbHamper };
Order order = new Order { OrderNo = "O1", OrderItem = orderItem };
await _context.Order.AddAsync(order);
await _context.SaveChangesAsync();
Attach
开始Tracking
Hamper hamper = new Hamper { Id = 1, Name = "H1" };
_context.Attach(hamper);
OrderItem orderItem = new OrderItem { Title = "T1", HamperId = hamper.Id, Hamper = hamper };
Order order = new Order { OrderNo = "O1", OrderItem = orderItem };
await _context.Order.AddAsync(order);
await _context.SaveChangesAsync();
或者,您可以通过HamperId
而不使用Hamper
Hamper hamper = new Hamper { Id = 1, Name = "H1" };
OrderItem orderItem = new OrderItem { Title = "T1", HamperId = hamper.Id };
Order order = new Order { OrderNo = "O1", OrderItem = orderItem };
await _context.Order.AddAsync(order);
await _context.SaveChangesAsync();
答案 1 :(得分:0)
IDbContextTransaction trn = testDBContext.Database.BeginTransaction();
Item itm = new Item();
itm.ItemId = 23;
itm.ItemName = "item23";
Type typt = typeof(Item);
DbSet<Item> Item1 = testDBContext.Set<Item>();
testDBContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Item] ON");
//Item1.FromSql("SET IDENTITY_INSERT [dbo].[Item] ON").SingleOrDefaultAsync();
testDBContext.Item.Add(itm);
testDBContext.SaveChanges();
//Item1.FromSql("SET IDENTITY_INSERT [dbo].[Item] OFF").SingleOrDefaultAsync();
testDBContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Item] OFF");
trn.Commit();
trn.Dispose();