实体框架,改变外键,但导航属性不变

本文关键字:导航 属性 框架 改变 实体 | 更新日期: 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"