EF 6中的一对一属性不会更新。

时间:2013-12-20 14:01:46

标签: ef-code-first entity-framework-6

我正在使用Entity Framework 6和Code First。

型号:

public class UserProfile
{
    [Key]
    public Guid UserID { get; set; }
    public Language PreferredLang { get; set; }
    //more properties
}
使用UserProfile列生成

PreferredLang_LanguageID表。我写了以下方法来保存用户个人资料。如果在DB中找到此UserID,我会更新,否则我会添加行。

public static void UpdateProfile(UserProfile userProfile)
{
    using (var db = new Context())
    {
        if (db.UserProfiles.Any(p => p.UserID == userProfile.UserID))
        {
            //does not save language properly
            db.UserProfiles.Attach(userProfile);
            db.Entry(userProfile).State = System.Data.Entity.EntityState.Modified;
            db.Entry(userProfile.PreferredLang).State = System.Data.Entity.EntityState.Modified;
        }
        else
        {
            //duplicates language
            db.UserProfiles.Add(userProfile);
        }
        db.SaveChanges();
    }
}

有两个问题。

  1. 当我创建新的UserProfile(db.UserProfiles.Add)时,即使已经存在语言,也会创建语言的新条目。 PreferredLanguage的ID = 2,在db.SaveChanges之后,它创建了ID = 5(可用的最小值)并设置PreferredLang_LanguageID = 5的新语言。 如何使用现有语言?

  2. 当我更新现有的UserProfile时,所有属性(列)都在DB中更新,`PreferredLang_LanguageID除外。这一个保持不变。 如何更新语言?

2 个答案:

答案 0 :(得分:1)

回答问题的第一部分 - 在不创建语言新条目的情况下保存。我附上PreferredLang

{
     db.UserProfiles.Add(userProfile);
     db.Languages.Attach(userProfile.PreferredLang);
}
db.SaveChanges();

答案 1 :(得分:0)

我知道这不是最优雅的解决方案,但它是唯一适合我的解决方案。如果找到现有条目,则将其删除,并将新实例附加到上下文:

if (db.UserProfiles.Any(p => p.UserID == userProfile.UserID))
{
     //not elegant, but only solution that works                   
     db.UserProfiles.Remove(db.UserProfiles.Find(userProfile.UserID));
}
db.UserProfiles.Add(userProfile);
db.Languages.Attach(userProfile.PreferredLang);
db.SaveChanges();