实体框架,改变外键,但导航属性不变
本文关键字:导航 属性 框架 改变 实体 | 更新日期: 2023-09-27 18:17:09
我有两个表是相关的数据库:变更订单和审核员。ChangeOrder有一个指向Auditor记录的外键AuditorId字段。
实体框架将关系构建为
public partial class ChangeOrder
{
public int Id { get; set; }
public Nullable<int> ActiveContractId { get; set; }
public virtual Auditor Auditor { get; set; }
每当我更改AuditorId时,我都没有看到ChangeOrder中相关的Auditor实体更新,在entity加载更改之前,正确的AuditorId和Auditor。但是,当我标记ChangeOrder时,Name会返回。State =状态。修改后,审计员实体变为空,即使在称为AuditorId的保存更新之后,但审计员记录为空。
我正在使用存储库模式:
ChangeOrder co;
using (UnitOfWork uow = new UnitOfWork())
{
using (ChangeOrderRepository changeOrderRepos = new ChangeOrderRepository(uow))
{
co = changeOrderRepos.All.Where(x => x.Id == id).Include(x => x.Auditor).FirstOrDefault();
// before this AuditorId = 1 and Auditor.Name is "Apple"
co.AuditorId = auditorNameId == -1 ? null : auditorNameId;
// now AuditorId = 2 and Auditor.Name is still "Apple", 2 = "Orange", but i have not saved so i get why it didn't change here
co.State = State.Modified;
changeOrderRepos.InsertOrUpdate(co);
}
uow.Save();
}
InsertOrUpdate方法是:
public void InsertOrUpdate(ChangeOrder entity)
{
if (entity.State == State.Added) // New entity
{
_context.Entry(entity).State = EntityState.Added;
}
else // Existing entity
{
_context.Entry(entity).State = EntityState.Modified;
}
}
第一次调用该方法时,AuditorId为2,AuditorId为2。当State变为Modified时,Name为Apple, AuditorId仍为2,但Auditor对象为空。
UnitOfWork类上的Save方法:
public int Save()
{
return _context.SaveChanges();
}
如果我再次查找记录,对象有正确的名称(橙色),我只是不明白为什么在我保存实体后没有得到审计记录更新。
我发现了一些有用的东西:http://msdn.microsoft.com/en-us/data/jj713564.aspx
在加载相关对象部分,我必须在InsertOfUpdate调用之后运行以下代码:
_context.Entry(entity).Reference(c => c.Auditor).Load();
这会导致navigationproperty重新加载,所以Auditor。Name = "Orange"