У меня есть настройки следующим образом.
Supermaster
имеет коллекцию Master
.
Master
с FK ссылкой на Reference
PK Id
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.