остановка ef-core для вставки ссылочной записи в основную таблицу - PullRequest
0 голосов
/ 14 июня 2019

У меня есть настройки следующим образом.

  1. Supermaster имеет коллекцию Master.
  2. Master с FK ссылкой на Reference PK Id
  3. Reference таблица содержит только справочные данные.

В коде ef, когда я загружаю записи из таблицы Supermaster, я добавляю reference к каждому Master на основе некоторого условия.

при отправке Supermaster я ожидаю, что Supermaster будет сохранено со всеми Master со ссылкой на Reference.

Но при dbContext.SaveChanges() EF пытается вставить запись в Reference и завершается неудачно с ограничением PK.

Что я пробовал до сих пор

Я пытался создать отношение один к одному с внешним ключом с помощью Fluent API.

Я пытался отсоединить сущность перед сохранением контекста

_context.Entry(programmingRecord.ProgrammingRecordParameters.Select(x=>x.ValidationRule)).State = EntityState.Detached;

.

Вот код.

Entity

Public class Supermaster
{
    public virtual ICollection<Master> ProgrammingRecordParameters { get; set; }
}

   public class Reference
    {
        public int Id { get; set; }
        public string Description { get; set; }
    }


   public class Master
    {
        public int Id { get; set; }
        public string DataGroup { get; set; }
        [ForeignKey("ValidationRuleId")]
        public Reference ValidationRule { get; set; }
        public int? ValidationRuleId { get; set; }
    }

API

    private void AddParameter(
            Supermaster rec,
            Master programmableParameter)
        {
            var param = new Master
            {                
                DataGroup = programmableParameter.DataGroup,
                ValidationRule = _context.References.FirstOrDefault(x=>x.Description==programmableParameter.DataGroup
            };

            rec.ProgrammingRecordParameters.Add(param);
        }

        public IActionResult PostProgrammingRecord([FromBody] Master programmingRecord)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }


            var repo = new ProgrammingRepository(_context);
            _context.ProgrammingRecords.Add(programmingRecord);
                _context.SaveChanges();
       }     

Ниже приводится стек ошибок

  HResult=0x80131500
  Message=An error occurred while updating the entries. See the inner exception for details.
  Source=Microsoft.EntityFrameworkCore.Relational
  StackTrace:
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _, ValueTuple`2 parameters)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IReadOnlyList`1 entries)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
   at RadioTMS.Web.Controllers.API.ProgrammingController.PostProgrammingRecord(ProgrammingRecord programmingRecord) in D:\TMS_Git_Repo\radio-tms\RadioTMS.Web\Controllers\API\ProgrammingController.cs:line 181
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()

Inner Exception 1:
SqlException: Cannot insert explicit value for identity column in table 'ValidationRules' when IDENTITY_INSERT is set to OFF.

1 Ответ

0 голосов
/ 14 июня 2019

EF пытается вставить запись в справочную таблицу, потому что контекст сущности не имеет загруженных справочных данных. Вы должны получить запись справки, загруженную в контексте, прежде чем вызывать изменения сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...