我正在使用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();
}
}
有两个问题。
当我创建新的UserProfile(db.UserProfiles.Add)时,即使已经存在语言,也会创建语言的新条目。 PreferredLanguage的ID = 2,在db.SaveChanges
之后,它创建了ID = 5(可用的最小值)并设置PreferredLang_LanguageID = 5
的新语言。 如何使用现有语言?
当我更新现有的UserProfile时,所有属性(列)都在DB中更新,`PreferredLang_LanguageID
除外。这一个保持不变。 如何更新语言?
答案 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();