2012-02-24 7 views
3

Я не использовал Entity Framework много, поэтому, пожалуйста, со мной.Сохранение изменений в дочерних коллекциях с помощью платформы Entity Framework

Я внес изменения в качестве EntityCollection который является объектом другого EntityCollection, и когда я пытаюсь сохранить эти изменения, я получаю следующее сообщение об ошибке:

The EntityCollection has already been initialized. The InitializeRelatedCollection method should only be called to initialize a new EntityCollection during deserialization of an object graph.

Любые идеи, что я мог бы быть не хватает?

Следующий код, который я использовал.

public void UpdateCompanyManagement(Company newCompany) 
{ 
    Company oldCompany = entities.Companies.Where(c => c.COM_ID == newCompany.COM_ID).SingleOrDefault(); 

    oldCompany.Managements = newCompany.Managements; 

    try 
    { 
     entities.SaveChanges(); 
    } 
    catch (OptimisticConcurrencyException) 
    { 
     entities.Refresh(RefreshMode.ClientWins, newCompany.Managements); 
     entities.SaveChanges(); 
    } 
} 

Я могу сохранить родительскую коллекцию успешно, используя следующий код:

public void UpdateCompanyDetails(Company newCompany) 
{ 
    Company oldCompany = entities.Companies.Where(c => c.COM_ID == newCompany.COM_ID).SingleOrDefault(); 
    entities.ObjectStateManager.ChangeObjectState(oldCompany.city, System.Data.EntityState.Modified); 
    oldCompany = newCompany; 

    try 
    { 
     entities.SaveChanges(); 
    } 
    catch (OptimisticConcurrencyException) 
    { 
     entities.Refresh(RefreshMode.ClientWins, oldCompany); 
     entities.SaveChanges(); 
    } 
} 

Любая помощь, почему первый код не будет работать высоко ценится. Спасибо заранее.

ответ

0

После долгих исследований, я нашел проблему в моей базе данных/модели (так как я использую устаревшую базу данных). В большинстве таблиц моей базы данных не было Первичного ключа, а у тех, кто это сделал, не было Спецификации идентификации, и это вызывало проблемы. Поэтому я исправил базу данных и обновил свою модель.

И, в конце концов, я нашел простой способ написать чистый EF-код.

кода в обеих функциях может быть переписан следующим образом:

public void UpdateCompanyManagement(Company company, int mgmtID) 
{ 
    var management = company.Managements.Where(m => m.M_ID == mgmtID).SingleOrDefault(); 

     management.name = "new name"; 
     management.position = "new position"; 

     // edit all you want, then save 
     // no further code is required 
     // except you've done something wrong somewhere 

    try 
    { 
     entities.SaveChanges(); 
    } 
    catch (OptimisticConcurrencyException) 
    { 
     entities.Refresh(RefreshMode.ClientWins, company); 
     entities.SaveChanges(); 
    } 
} 

, а также,

public void UpdateCompanyDetails(Company company) 
{ 
    company.name = "new company name"; 
    company.address = "new company address"; 

    // edit all you want then save 
    // no further code is required 
    // except you've done something wrong somewhere 

    try 
    { 
     entities.SaveChanges(); 
    } 
    catch (OptimisticConcurrencyException) 
    { 
     entities.Refresh(RefreshMode.ClientWins, company); 
     entities.SaveChanges(); 
    } 
} 

Спасибо, Петр Викинг! :)

2

Насколько я понимаю, вы эффективно пытаетесь изменить родительские элементы в коллекции Management. EF с трудом пытается понять ваше намерение.

Спрашивалось herehere.

+0

Спасибо @dmitry. –

+0

Отвечает ли ваш вопрос на ваш вопрос? –

+0

Фактически @dmitry ресурсы были очень информативными, но в этом случае они не совпадают. Я опубликовал решение, которое сработало для меня. –

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