C# 实体框架不会保存所有更改
这一次我几乎要哭了 我有一个用户对象 此对象具有多个属性FirstName、LastName等。所有属性都是简单类型。字符串int等 这些可以很好地加载和更新C# 实体框架不会保存所有更改,c#,entity-framework,C#,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
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;
}
}
这就像它应该做的那样。那么为什么**won my regular Save()方法不起作用?这很可能是因为
TelephoneCountryCodeObject
不是数据库的动态代理,可能只是一个普通对象。我相信,如果附加结果,则可以保存更改
Jobwalker result = (from jw in db.Jobwalkers
.Include("TelephoneCountryCodeObject")
where jw.UmbracoMemberID == UmbracoMemberID
select jw).FirstOrDefault();
db.TelephoneCountryCodes.Attach(result);
如果您需要更新已分离的实体(例如,您实例化了对象,但没有从数据库中提取),则应具有该实体的主键并使用以下代码:
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将检测您的更改并更新实体,并将子实体添加到数据库。作为旁注,
using
语句隐式使用try
块来防止异常,因此您不需要将其封装在静默的try catch中。Jobwalker result=(来自db.Jobwalkers.Include中的jw(“TelephoneCountryCodeObject”),其中jw.UmbracoMemberID==UmbracoMemberID选择jw)。FirstOrDefault();您确定返回了正确的数据吗?@GoranŠtuc是的,我找到了正确的用户。当我尝试设置FirstName和TelephoneCountryCodeObject时,FirstName会更新,但TelephoneCountryCodeObject仍然为空…可能TelephoneCountryCodeObject导航属性映射不正确?可能它映射到Jobwalke上r类,但不在用户类上?它是如何映射的?我认为您应该进一步解释您的问题。您是否使用CodeFirst?您的Save
方法位于哪里?您如何检查TelephoneCountryCode
是否更新?(您是在SqlServer上运行sql查询还是仅使用您的代码)db.TelephoneCountryCodes.Attach(结果);不起作用,因为结果的类型为JobWalker,而不是TelephoneCountryCode相同的结果:(.只更新名字。我开始认为我的代码只是FUBARI我不明白为什么EF对我来说这么难用?我正在认真考虑去掉EF,把所有东西都转换成存储过程。这样我就知道,如果我告诉数据库保存一些东西,它就会被保存。@FlyingHippo:作为一条建议:请小心清楚当你问问题时,确切地说出你想做什么!一旦你知道如何使用EF,它就变得轻而易举了。你只需要澄清你想将对象添加到DB.TelephoneCountryCodes
,或者只是更新子实体(意思是jw.TelephoneCountryCodeObject
),我会告诉你怎么做!目前上面的代码添加了实体。我想你正在尝试更新JobWalker
和它的子对象类型TelephoneCountryCode
!?我感谢你的帮助,但我得出的结论是我的代码太乱了。我将从头开始。我将请将您的回答标记为已接受,因为它确实对我有所帮助。再次感谢。不客气。请尝试阅读有关EF的问题。