entity framework不保存所有更改

我非常接近这个眼泪。

我有一个用户对象,这个对象有几个属性FirstName,LastName等所有简单类型。 字符串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; } } 

任何想法将不胜感激!

编辑:我创建了这个超级简单的测试方法

  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()方法不起作用?

如果您需要更新已分离的实体(例如,您在没有从数据库中提取的情况下实例化对象),您应该拥有它的主键并使用以下代码:

 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将检测您的更改并更新实体并将子实体添加到数据库。

这很可能是由于TelephoneCountryCodeObject不是数据库中的动态代理,并且可能只是一个普通对象。 我相信如果您附加结果,那么您将能够保存更改。

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