Entity Framework Core - невозможно вставить явное значение при сохранении в другую таблицу - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь создать объект 'Order', который имеет коллекцию 'OrderItem's, которая содержит объект' Hamper '.По сути, всякий раз, когда я пытаюсь сохранить объект «Порядок» в моей базе данных, я получаю эту ошибку, что я не могу вставить значения экспликации в таблицу для моих препятствий, за исключением того, что я не изменяю данные Hamper, я простоиспользуя эти объекты в другом объекте.Моя модель корзины имеет:

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

До объекта первичного ключа.Я понятия не имею, что делать, чтобы быть совершенно честным, и ничто из того, что я нашел в Интернете, похоже, не помогло.Независимо от того, добавляю ли я Explicity добавление объекта «OrderItem» по одному или всю коллекцию в объекте «Order», я все еще не могу избежать этой ошибки.Я связал HamperID внутри OrderItem как внешний ключ, и у меня не было этой проблемы при сохранении объектов в других объектах, это просто пример.Во всяком случае, здесь ошибка.Я не ожидал бы, что включение моделей очень поможет, но конкретная ошибка заключается в следующем:

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 голосов
/ 17 апреля 2019
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();
0 голосов
/ 26 ноября 2018

Чтобы 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();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...