System.InvalidOperationException: 'The instance of entity type 'Borrower' cannot be
tracked because another instance with the key value '{BorrowerId: -2147482647}' is
already being tracked. When attaching existing entities, ensure that only one
entity instance with a given key value is attached.'
Приведенная выше ошибка возникает при попытке вставить массив данных на сервер SQL с помощью Entity Framework.
Ниже приведен массив JSON, который я пытаюсь вставить в базу данных,Массив содержит два элемента, и я полагаю, что ошибка вызвана структурой сущности, вставляющей два элемента массива в базу данных с одинаковым идентификатором.Если я удаляю один элемент из массива, данные вставляются как обычно.Тот факт, что один элемент вставлен правильно, также указывает на то, что проблема не в данных, которые в настоящее время хранятся в базе данных.
"borrower": [
{
"borrowerId": 0,
"address": {
"addressId": 0,
"houseNum": "string",
"houseName": "string",
"streetName": "string",
"locality": "string",
"town": "string",
"county": "string",
"postcode": "NE11NE"
},
"title": 1,
"firstName": "string",
"lastName": "string",
"dob": "2018-10-17T09:22:00.422",
"homeNumber": "01212122222",
"workNumber": "01212122222",
"mobileNumber": "01212122222",
"email": "borrower@borrower.com"
},
{
"borrowerId": 0,
"address": {
"addressId": 0,
"houseNum": "string",
"houseName": "string",
"streetName": "string",
"locality": "string",
"town": "string",
"county": "string",
"postcode": "NE11NE"
},
"title": 1,
"firstName": "string",
"lastName": "string",
"dob": "2018-10-17T09:22:00.422",
"homeNumber": "01212122222",
"workNumber": "01212122222",
"mobileNumber": "01212122222",
"email": "borrower@borrower.com"
}
]
Методы, вызываемые в этой ситуации, относительно просты и поэтому не должны бытьисточник ошибки, но я включил их ниже для ясности.
Отправить инструкцию
[HttpPost]
public IActionResult SendInstruction([FromBody]SolicitorInstruction si)
{
//Validate
ValidationController controller = new ValidationController();
bool instructionIsValid = controller.ValidateInstruction(si);
if (instructionIsValid)
{
_instructionRepo.CreateInstruction(si);
Console.WriteLine("\nInstruction successfully inserted into database records.\n");
return Ok("Successfully added instruction into database.");
}
Console.WriteLine("\nInvalid Data: Insert into database records aborted.\n");
return BadRequest(controller.ErrorMessages);
}
Создать инструкцию
public void CreateInstruction(SolicitorInstruction instruction)
{
_context.SolicitorInstructions.Add(instruction);
_context.SaveChanges();
}
DbContext - Используется для создания модели EF.
public class SolicitorContext : DbContext
{
public DbSet<AdditionalInformation> AdditionalInformations { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<Borrower> Borrowers { get; set; }
public DbSet<BorrowerBank> BorrowerBanks { get; set; }
public DbSet<Broker> Brokers { get; set; }
public DbSet<CurrentLender> CurrentLender { get; set; }
public DbSet<Occupier> Occupiers { get; set; }
public DbSet<Property> Properties { get; set; }
public DbSet<Solicitor> Solicitors { get; set; }
public DbSet<SolicitorInstruction> SolicitorInstructions { get; set; }
public SolicitorContext(DbContextOptions<SolicitorContext> options)
: base(options)
{
}
Таблица заемщика
[Table("Borrower")]
public partial class Borrower
{
[Key]
public int BorrowerId { get; set; }
[ForeignKey("AddressId")]
public Address Address { get; set; }
//public bool BorrowerAddressIsCorrespondenceAddress { get; set; }
public Honorifics Title { get; set; }
[StringLength(32)]
public string FirstName { get; set; }
[StringLength(32)]
public string LastName { get; set; }
public DateTime Dob { get; set; }
[StringLength(32)]
public string HomeNumber { get; set; }
[StringLength(32)]
public string WorkNumber { get; set; }
[StringLength(32)]
public string MobileNumber { get; set; }
[StringLength(64)]
public string Email { get; set; }
}