var orgAcc = db_.Accounts.Find(account.Id);
db_.Entry(orgAcc).CurrentValues.SetValues(account);
orgAcc.Company = db_.Companys.Find(account.Company.Id);
db_.SaveChanges();
这是更新实体关联的最简单方法吗?
public class ChartofAccount: MasterData
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(6)]
public string Code { get; set; }
public virtual Company Company { get; set; }
[Required]
public string AccountName { get; set; }
[Required]
[StringLength(3)]
public string AccountCurrency { get; set; }
public virtual AccountCatagory Category1 { get; set; }
public virtual AccountCatagory Category2 { get; set; }
public string Reference { get; set; }
public bool HasTransaction { get; set; }
}
答案 0 :(得分:0)
SetValues
的工作方式是逐个属性比较,对于也在参数中的左手对象的每个属性,它具有匹配类型,它将更新左边带有参数值的-hand对象。
我认为account.Company
是orgAcc.Company
的不同类型的对象,例如来自MVC控制器参数的东西(即帐户及其引用的对象不是EF实体)。在这种情况下,您的方法似乎是一种合理的方式。
话虽这么说,orgAcc
可能有一个Company
属性和一个CompanyId
属性,以支持EF关系,所以,如果你跟随account
个对象相同的模式,即直接存储CompanyId
字段,而不必在公司中导航,然后SetValues可以自动更新CompanyId字段,该字段应在保存更改时更新外键。这样,您还可以避免专门指定orgAcc.Company
字段的步骤。