实体框架核心-保存到另一个表时无法插入显式值

时间:2018-11-23 09:01:11

标签: sql asp.net-core asp.net-core-mvc entity-framework-core sqlexception

我正在尝试创建一个“订单”对象,该对象的“ 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; }

2 个答案:

答案 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();