2016-01-21 5 views
1

У меня есть объект, который я пытаюсь выполнить обновление с помощью Entity Framework 5.EF Обновление аффилированной таблицы вставка вместо обновления

После того, как я получить существующий объект и перейти на обновление полей, он правильно обновляет базовый объект «тренер», но не обновляет объект Address и вместо этого вставляет его снова, вместо того, чтобы обновлять его с помощью нового первичного ключа, даже если ему был передан существующий первичный ключ для повторного использования.

Любая помощь приветствуется.

Ниже упрощенных вниз версия кода:

using (AltairEntities context = new AltairEntities()) 
        { 
         dtlCoach coach = context.dtlCoaches.FirstOrDefault(x => x.CoachID == coachId); 
         coach.Name = "Bob"; 
         coach.Description = "sample"; 
         coach.dtlCoachAddresses.Add(PrepareAddress(coach.dtlCoachAddresses.First().CoachAddressID)); 
         context.Database.Connection.Open(); 
         context.Entry(coach).State = EntityState.Modified; 
         context.SaveChanges(); 
        } 

public static dtlCoachAddress PrepareAddress(int existingId) 
     { 
      dtlCoachAddress newAddress = new dtlCoachAddress(); 
      try 
      { 
       newAddress.CoachAddressID = existingId; 
       newAddress.AddressLine1 = "Line 1"; 
       newAddress.AddressLine2 = "Line 2"; 

       return newAddress; 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

UPDATE: Так что я нашел, если я кормлю существующий dtlCoachAddress объект внутри объекта dtlCoach в функцию PrepareAddress в качестве параметра вместо того, чтобы объявить объект как новый, он корректно обновляется. В чем разница между объектом dtlCoachAddress от объекта и объектом dtlCoachAddress, определенным из new, если я передаю ему все те же параметры? Но два определяют, будет ли объект вставлен или обновлен?

+0

Для упрощения вашей проблемы «тренер» обновляется правильно. Нет проблем в этом объекте. Вы также хотите добавить новый «адрес». И затем верните его к «тренеру». Но это не работает. Это правильно? –

+0

Я хочу обновить адрес, а не добавить новый и сохранить ссылку на тренера. – Cyassin

+0

Я бы получил адрес из адресной таблицы вместо создания нового объекта, а затем назначил его тренеру. – Tarik

ответ

1

Я не уверен, как вы разместили PK и FK в своих сущностях. Таким образом, это решение имеет несколько предположений.

Обновление снова для соответствия методам OPs.

using (AltairEntities context = new AltairEntities()) 
{ 
    dtlCoach coach = context.dtlCoaches.FirstOrDefault(x => x.CoachID == coachId); 
    coach.Name = "Bob"; 
    coach.Description = "sample"; 
    //coach.dtlCoachAddresses.Add(PrepareAddress(coach.dtlCoachAddresses.First().CoachAddressID)); 
    //context.Database.Connection.Open(); 
    //context.Entry(coach).State = EntityState.Modified; 

    var address = context.dtlCoachAddresses.FirstOrDefault(a => a.CoachAddressID == coachId);  
    if(address != null) 
    { 
    address.AddressLine1 = "Line 1"; 
    address.AddressLine2 = "Line 2";         
    }  
    context.SaveChanges(); 
} 

/*This function is not required 
public static dtlCoachAddress PrepareAddress(int existingId) 
{ 
using (AltairEntities context = new AltairEntities()) 
{ 
var address = context.dtlCoachAddresses.FirstOrDefault(a => a.CoachAddressID == coachId);  
if(address != null) 
{ 
    address.AddressLine1 = "Line 1"; 
    address.AddressLine2 = "Line 2"; 
    context.SaveChanges();//update an existing address.        
} 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
}*/ 
+0

CoachAddressID принадлежит к объекту Address и содержит внешний ключ CoachID для связи с объектом-тренером как отношения 1-N. Таблица dtlCoach имеет ограничение на таблицу dtlCoachAddress, так что объект dtlCoachAddress можно получить из объекта dtlCoach. @ kosala-w – Cyassin

+0

@Nick Означает ли это 'address.CoachAddressID == coach.CoachID'. ? –

+0

Нет, адрес также содержит внешний ключ Coach_ID, который используется как ограничение для таблицы тренера. Это означает, что 1 тренд - множественное адресное отношение. @ kosala-w – Cyassin

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