延迟加载不起作用时添加分离的实体
作者:互联网
我有一个使用.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; }
}
实体是我每次更新或添加EntityTwo时都需要进行计算的另一个实体.
注释行未注释时,该代码有效.但是,如果按照这种方式显示,则延迟加载将无法进行,并且我将获得null异常.
延迟加载设置为true,并且实体应该是正确的,因为它在我显式加载navigation属性时起作用.
我对这些名称感到抱歉,但是很遗憾,我无法发布真实的代码;(
解决方法:
延迟加载不起作用,因为(很可能)您传递给方法的entityTwo不是动态代理,为了使延迟加载起作用,它必须是动态代理.该实例可能是在方法外部使用entityTwo = new EntityTwo();创建的.要创建实体的代理,您需要一个可用的上下文实例,然后使用
entityTwo = _db.EntityTwos.Create();
我认为使用显式加载(您的注释行)是这种情况下的最佳解决方案.每个导航属性一次查询数据库的成本相同,例如延迟加载比延迟加载具有更多优势,您可以从相关实体中投影只需要选择的属性,例如:
entityId = _db.Entry(entityTwo).Reference(eTwo => eTwo.EntityOne).Query()
.Select(eOne => eOne.EntityId)
.Single();
标签:asp-net-mvc-4,lazy-loading,c,entity-framework 来源: https://codeday.me/bug/20191123/2064463.html