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

问题描述 投票:0回答:2

我正在尝试创建一个'Order'对象,该对象具有一个'OrderItem'集合,其中包含'Hamper'对象。基本上,每当我尝试将'Order'对象保存到我的数据库时,我不断收到这个错误,我不能在表中为我的hampers插入explict值,除了我没有改变Hamper数据,我只是在另一个对象中使用这些对象。我的篮子模型有:

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

在主键对象之前。我不知道如何做到完全诚实,我在网上找到的任何东西似乎都没有帮助。无论我是明确地逐个添加'OrderItem'对象还是'Order'对象中的整个集合,我仍然无法摆脱这个错误。我已将'OrderItem'中的HamperID链接为foriegn键,并且在将对象保存在其他对象中时我没有遇到此问题,这只是这个例子。无论如何,这是错误。我不希望包括模型会有多大帮助,但具体错误如下:

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; }
sql asp.net-core asp.net-core-mvc entity-framework-core sqlexception
2个回答
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();
  • 或者,你可以通过没有HamperIdHamper 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();

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();
© www.soinside.com 2019 - 2024. All rights reserved.