2014-11-17 3 views
0

Ниже приведено несколько базовых кодов, которые являются частью нашего метода контроллера Create. Если выбран определенный флажок, мы хотим создать копию объекта agenttransmission, который мы сейчас создаем, с измененными парами полей.Entity framework отслеживает неправильный объект модели после вспомогательного метода

Когда программа переходит в вспомогательном метод, он создает sub записи без происшествий, однако по какой-то причине, когда программа заканчивается и возвращается к методу Create, модель объект agenttransmission становится объектом sub модели. Все значение, включая PK, внезапно нажимают на объект agenttransmission.

Не знаете, как это происходит, так как есть возвращаемое значение string на вспомогательном методе, и никакие поля не касаются записи agenttransmission.

метод создания

//Create substat if requested 
if (agenttransmission.OverrideId) 
{ 
    status += ". " + CreateSubStat(agenttransmission); 
} 

метод Helper

public string CreateSubStat(AgentTransmission master) 
    { 
     string msg = string.Empty; 
     if (ModelState.IsValid) 
     { 
      using (AgentResourcesEntities tempDb = new AgentResourcesEntities()) 
      { 
       try 
       { 
        //Check to see if substat already exists 
        var check = (from a in db.AgentTransmission 
           where a.ParentId == master.ID && a.RecordStatus.Equals("P") 
           select a).ToList(); 

        if (check.Count > 0) return string.Empty; 

        //If not add dependent record 
        AgentTransmission sub = master; 
        sub.OverrideId = false; 
        sub.DRMCompanyId = string.Empty; 
        sub.CONCode = "00"; 
        sub.RecordStatus = "P"; 
        sub.ParentId = master.ID; 
        sub.ID = 0; 
        sub.IsSubstat = true; 
        sub.SendToDynamicsOptions = "N"; 
        sub.SendToNMF = false; 

        //Remove blanks from ClearinghousePartners list 
        sub.ClearinghousePartners.RemoveAll(
         x => 
         string.IsNullOrWhiteSpace(x.ClearingHouseName) && 
         string.IsNullOrWhiteSpace(x.TradingPartnerName) && x.StartDate == null); 

        sub.AgentRelationshipCodes.RemoveAll(
         x => 
         string.IsNullOrWhiteSpace(x.RelationshipId) && 
         !x.EffectiveDate.HasValue && x.Id == 0); 

        foreach (var item in sub.AgentRelationshipCodes) 
        { 
         item.LastChangeDate = DateTime.Now; 
         item.LastChangeId = SecurityRules.GetUserName(User); 
         item.AgentTransmission = sub; 
         item.AgtTableId = sub.ID; 
        } 

        foreach (var item in sub.ClearinghousePartners) 
        { 
         item.AgentTransmission = sub; 
         item.AgtTransId = sub.ID; 
        } 

        db.AgentTransmission.Add(sub); 
        db.SaveChanges(); 

        msg = "Substat saved with status of 'Dependent'."; 
       } 
       catch (DbEntityValidationException dbEx) 
       { 
        msg = "Error creating substat. IT has been informed and will respond shortly."; 
        SendEmail.ErrorMail(dbEx.Message, SecurityRules.GetUserName(User)); 
       } 
       catch (Exception ex) 
       { 
        msg = "Error creating substat. IT has been informed and will respond shortly."; 
        SendEmail.ErrorMail(ex, SecurityRules.GetUserName(User)); 
       } 
      }     
     } 
     else 
     { 
      //Invalid ModelState error handling 
      string messages = string.Join("; ", ModelState.Values 
                  .SelectMany(x => x.Errors) 
                  .Select(x => x.ErrorMessage)); 
      SendEmail.ErrorMail("Error Creating Substat: " + messages, SecurityRules.GetUserName(User)); 
      msg = "Error creating substat. IT has been informed and will respond shortly."; 
     } 

     return msg; 
    } 

ответ

2

линия ...

AgentTransmission sub = master; 

... не копирует master в sub, но присваивает его sub, потому что AgentTransmission является ссылочным типом. Итак, все, что вы делаете до sub, вы делаете до master.

Вы должны либо клонировать master в sub (создать новый объект и скопировать его свойство), или повторно извлечь главный объект из базы данных после CreateSubStat вызова.

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