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

时间:2014-08-07 14:06:10

标签: c# asp.net entity-framework

我有两个在数据库中相关的表: ChangeOrder和Auditor。 ChangeOrder有一个外键AuditorId字段,指向Auditor记录。

实体框架将关系构建为

public partial class ChangeOrder
{
    public int Id { get; set; }
    public Nullable<int> ActiveContractId { get; set; }
    public virtual Auditor Auditor { get; set; }

每当我更改AuditorId时,我都没有在ChangeOrder更新中看到相关的Auditor实体,在实体加载它之前进行更改时,正确的AuditorId和Auditor.Name会返回,但是,当我标记ChangeOrder.State = State.Modified,Auditor实体变为null,即使在调用save之后AuditorId被更新,但Auditor记录为null。

我正在使用存储库模式:

            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,而Auditor.Name为&#34; Apple&#34;一旦State更改为Modified,AuditorId仍为2,但Auditor对象为null。

UnitOfWork类的Save方法:

        public int Save()
    {
        return _context.SaveChanges();
    }

如果我再次查找记录,该对象具有正确的名称(橙色),我只是不明白为什么在我执行保存之后,实体也没有更新Auditor记录。< / p>

1 个答案:

答案 0 :(得分:2)

我在这里找到了一些帮助: http://msdn.microsoft.com/en-us/data/jj713564.aspx

在“加载相关对象”部分中,我必须在InsertOfUpdate调用后运行以下命令:

_context.Entry(entity).Reference(c => c.Auditor).Load();

这导致导航属性重新加载,因此Auditor.Name是&#34; Orange&#34;应该是的。