2013-09-16 3 views
3

Im очень близко к слезам на этом.Entity Framework не сохраняет все изменения

У меня есть пользовательский объект Этот объект имеет несколько свойств FirstName, LastName и т. Д. Все простые типы. String int и т. Д.

Они загружаются и обновляются отлично.

public class Jobwalker 
{ 
    [Key] 
    public Int64 ID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public bool Suspended { get; set; } 
    public TelephoneCountryCode TelephoneCountryCodeObject { get; set; } 
    ... 

Но userobject также имеет свойство «TelephoneCountryCodeObject», который является еще один класс

public class TelephoneCountryCode 
{ 
    [Key] 
    public Guid ID { get; set; } 
    public string Code { get; set; } 
    public string Country { get; set; } 

    public TelephoneCountryCode() 
    { 
    } 
    ... 

Я могу создать удалить dmodify «TelephoneCountryCode'-объекты просто отлично, , но когда я пытаюсь сохранить экземпляр объекта-пользователя обновляется только простые типы?

public void Save() 
    { 
     try 
     { 
      using (var db = new MainContext()) 
      { 

       db.TelephoneCountryCodes.Attach(TelephoneCountryCodeObject); 
       Jobwalker result = (from jw in db.Jobwalkers 
             .Include("TelephoneCountryCodeObject") 
            where jw.UmbracoMemberID == UmbracoMemberID 
            select jw).FirstOrDefault(); 


       db.Entry(result).CurrentValues.SetValues(this); 

       if (this.TelephoneCountryCodeObject != null) 
       { 
        result.TelephoneCountryCodeObject = db.TelephoneCountryCodes.Find(this.TelephoneCountryCodeObject.ID); 
       } 
       else 
       { 
        result.TelephoneCountryCodeObject = null; 
       } 

       db.Entry(result).State = EntityState.Modified; 

       db.SaveChanges(); 
      } 
     } 
     catch(Exception ex) 
     { 
      throw; 
     } 
    } 

Любые идеи были бы весьма признательны!

EDIT: Я создал этот супер простой метод испытания

public static void TEST() 
    { 
     try 
     { 
      using (var db = new MainContext()) 
      { 
       Jobwalker result = (from jw in db.Jobwalkers 
             .Include("TelephoneCountryCodeObject") 
            where jw.UmbracoMemberID == 1184 
            select jw).FirstOrDefault(); 



       result.TelephoneCountryCodeObject = TelephoneCountryCode.GetByName("denmark"); 
       db.TelephoneCountryCodes.Attach(result.TelephoneCountryCodeObject); 
       result.FirstName = "Flemming"; 

       db.SaveChanges(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

Это работает как предполагается. Тогда почему * * не работает мой обычный метод Save()?

+0

В качестве примечания стороны 'use' неявно использует блок' try' для защиты от исключений, поэтому вам не нужно обертывать его в тихий try catch. –

+0

Результат Jobwalker = (from jw in db.Jobwalkers . Включить («PhoneCountryCodeObject») где jw.UmbracoMemberID == UmbracoMemberID select jw) .FirstOrDefault(); Вы уверены, что получили правильные данные? –

+0

@Goran Štuc Да, я получаю правильный пользователь. Когда я пытаюсь установить как FirstName, так и PhoneCountryCodeObject, FirstName будет обновляться, но PhoneCountryCodeObject остается null ... – FlyingHippo

ответ

2

Если вам необходимо обновить объект, который отсоединяется (например, вы инстанцированный объект без извлечения из базы данных), вы должны иметь это первичный ключ и использовать код ниже:

public void Update(Jobwalker detachedEntity) 
{ 
    DB.Jobwalkers.Attach(detachedEntity); 
    DB.Entry(detachedEntity).State = EntityState.Modified; 
} 

// in your code to save Jobwalker detached object do this: 
Update(this); // `this` is the Jobwalker detached object 
DB.SaveChanges(); 

Там нет необходимости в дополнительном коде, EF будет определять ваши изменения и обновлять объект и добавлять дочерние объекты в базу данных.

+0

@FlyingHippo: я обновил код, это должно сработать. – Ashkan

+0

такой же результат :( только FirstName обновляется. Я начинаю думать, что мой код просто FUBAR – FlyingHippo

+0

Я не понимаю, почему EF так сложно использовать? Im серьезно подумываю о том, чтобы избавиться от EF и преобразовать все в хранимые процедуры Вместо этого. Я знаю, что если я скажу базе данных о том, чтобы что-то сохранить, он будет сохранен. – FlyingHippo

1

Это, скорее всего, результат TelephoneCountryCodeObject не является динамическим прокси-сервером из базы данных и, вероятно, просто является простым объектом. Я считаю, что если вы приложите результат, вы сможете сохранить изменения.

Jobwalker result = (from jw in db.Jobwalkers 
    .Include("TelephoneCountryCodeObject") 
    where jw.UmbracoMemberID == UmbracoMemberID 
    select jw).FirstOrDefault(); 
db.TelephoneCountryCodes.Attach(result); 
+1

db.TelephoneCountryCodes.Attach (result); не работает, потому что результат имеет тип JobWalker, а не TelephoneCountryCode – FlyingHippo

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