实体框架不会保存所有更改
本文关键字:保存 框架 实体 | 更新日期: 2023-09-27 18:31:35
我非常接近这个眼泪。
我有一个用户对象此对象具有多个属性 FirstName、LastName 等,都是简单类型。字符串整数等
这些加载和更新正常。
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; }
...
但是用户对象还有一个属性'TPhoneCountryCodeObject',它是另一个类
。public class TelephoneCountryCode
{
[Key]
public Guid ID { get; set; }
public string Code { get; set; }
public string Country { get; set; }
public TelephoneCountryCode()
{
}
...
我可以创建一个删除一个 dmodify "电话国家代码"对象就好了,但是当我尝试保存用户对象的实例时,只有简单类型会更新?
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);