У меня возникли проблемы с использованием вспомогательного метода для выполнения обновления для набора объектов модели. В таблице используется таблица поиска для хранения 5 записей на агента/пользователя. Если я хочу сохранить запись для агента, мне нужно сохранить эту запись в таблице AgentTransmission
и до 5 других записей в таблице RelationshipCodeLookup
.Передача объекта Entity Framework для вспомогательного метода для обновления
Поскольку я должен сделать это пять раз для каждого агента, и мы должны сделать этот процесс в методах Create и Edit, я создал вспомогательный метод для сохранения записей. Это прекрасно работает во время процесса создания, поскольку мы просто делаем DbContext.Add()
. Однако, когда мне нужно выполнить обновление, я получаю сообщение об ошибке
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
Я думаю, что это связано с тем, что я передаю объект модели на мой вспомогательный метод, и поэтому DbContext
думает, что у него есть два отдельных объекта для отслеживания. Я говорю это, потому что строки кода, которые закомментированы, работают очень хорошо и позволяют мне сохранить объект. Однако передача объекта методу помощника получает вышеуказанную ошибку.
Кто-нибудь знает об этом (используя вспомогательный метод для выполнения обновления)?
Действие контроллера
//Save relationship codes in lookup table
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode1))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode1, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode2))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode2, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode3))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode3, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode4))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode4, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode5))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode5, agenttransmission.ID);
}
Helper Метод
public void SaveRelationshipCodes(RelationshipCodeLookup relCode, int id)
{
if (relCode.AgentId == 0) relCode.AgentId = id;
relCode.LastChangeDate = DateTime.Now;
relCode.LastChangeId = Security.GetUserName(User);
//Check to see if record exists and if not add it
if (db.RelationshipCodeLookup.Find(id, relCode.RelCodeOrdinal) != null)
{
db.Entry(relCode).State = EntityState.Detached;
}
else
{
if(relCode.RelCodeOrdinal == 0) relCode.RelCodeOrdinal = FindOrdinal(relCode);
db.RelationshipCodeLookup.Add(relCode);
}
db.SaveChanges();
}
EDIT
После рыщут в Интернете я пытался спасти с помощью этого метода
//Check to see if record exists and if not add it
if (db.RelationshipCodeLookup.Find(id, relCode.RelCodeOrdinal) != null)
{
db.Entry(relCode).CurrentValues.SetValues(relCode);
}
else
{
Member 'CurrentValues' cannot be called for the entity of type 'RelationshipCodeLookup because the entity does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<RelationshipCodeLookup>
Однако .... делать это только ставит меня в начале со следующей ошибкой на db.RelationshipCodeLookup.Attach(relCode);
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
Эта строка кода 'db.RelationshipCodeLookup.Attach (relCode);' дает мне тот же «объект с тем же ключом уже существует» сообщение об ошибке, что я получал. – NealR