2013-11-14 3 views
1

У меня возникли проблемы с использованием вспомогательного метода для выполнения обновления для набора объектов модели. В таблице используется таблица поиска для хранения 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. 

ответ

0

Проблема здесь заключается в том, что Entity Framework не может одновременно отслеживать два объекта одного и того же типа. Из-за этого я считаю решение этой проблемы более чем странным. Вызвав .Find() на DbContext и создав экземпляр второй копии объекта модели, я, наконец, смог сохранить. Кажется, нарушить все правила, которые EF планировал мне в сообщениях об ошибках, но это работает.

public void SaveRelationshipCodes(int id, RelationshipCodeLookup relCode) 
    { 
     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) 
     { 
      //Need to call .Find to get .CurrentValues method call to work 
      RelationshipCodeLookup dbRelCode = db.RelationshipCodeLookup.Find(id, relCode.RelCodeOrdinal); 
      db.Entry(dbRelCode).CurrentValues.SetValues(relCode); 
     } 
     else 
     { 
      if(relCode.RelCodeOrdinal == 0) relCode.RelCodeOrdinal = FindOrdinal(relCode); 
      db.RelationshipCodeLookup.Add(relCode); 
     } 

     db.SaveChanges(); 
    } 
0

Попробуйте это:

db.RelationshipCodeLookup.Attach(relCode); 
db.Entry(relCode).State = EntityState.Modified; 

Для обновления вы хотите приложить а затем установите его состояние для изменения.

+0

Эта строка кода 'db.RelationshipCodeLookup.Attach (relCode);' дает мне тот же «объект с тем же ключом уже существует» сообщение об ошибке, что я получал. – NealR

Смежные вопросы