3

我有一个使用 .NET 4.5 下的 Entity Framework 5 的 ASP.NET MVC 4 应用程序。我遇到的问题是,当我插入在前端创建的分离实体时,延迟加载不起作用。

这是我要添加(或更新)的代码:

public static int PersistMergeEntity(EntityTwo entityTwo)
{
    int entityId;

    using (var _db = new EntityDb())
    {
        if (_db.EntityTwo.Any(e => e.EntityTwoId == entityTwo.EntityTwoId))
        {
            _db.Entry(entityTwo).State = EntityState.Modified;
        }
        else
        {
            _db.EntityTwo.Add(entityTwo);
        }

        _db.SaveChanges();

        //_db.Entry(entityTwo).Reference(e => e.EntityOne).Load();
        entityId = entityTwo.EntityOne.EntityId;
    }

    EntityBo.UpdateData(entityId);

    return entityTwo.EntityTwoId;
}

这是我的实体:

public class EntityTwo
{
    [Key]
    [ForeignKey("EntityOne")]
    public int EntityTwoId { get; set; }

    public Decimal NbValue { get; set; }

    public virtual EntityOne EntityOne { get; set; }
}

public class EntityOne
{
    [Key]
    [ForeignKey("EntityTwo")]
    public int EntityOneId { get; set; }

    [ForeignKey("Entity")]
    public int EntityId { get; set; }

    public CsMonthDomain CsMonth { get; set; }
    public int NbYear { get; set; }
    public Decimal NbValue { get; set; }

    public virtual Entity Entity { get; set; }
    public virtual EntityTwo EntityTwo { get; set; }
}

并且Entity是我每次更新或添加时都需要进行计算的另一个实体EntityTwo

该代码在注释行未注释时有效。但如果它是那里显示的方式,延迟加载将不起作用,我会得到一个null异常。延迟加载设置为true并且实体应该是正确的,因为它在我显式加载导航属性时起作用。

我很抱歉这些名字,但不幸的是我不能发布真正的代码;(

4

1 回答 1

3

延迟加载不起作用,因为entityTwo您传递给该方法(很可能)不是动态代理,它必须是为了使延迟加载工作。该实例可能是在使用方法之外创建的entityTwo = new EntityTwo();。要创建实体的代理,您需要一个可用的上下文实例,然后使用

entityTwo = _db.EntityTwos.Create();

在我看来,在这种情况下使用显式加载(您的注释行)是最好的解决方案。它具有与每个导航属性(如延迟加载)查询数据库相同的成本,加上延迟加载的额外好处,您可以从相关实体中投影您只需要的属性选择,例如:

entityId = _db.Entry(entityTwo).Reference(eTwo => eTwo.EntityOne).Query()
    .Select(eOne => eOne.EntityId)
    .Single();
于 2013-07-16T19:46:46.537 回答