gpt4 book ai didi

c# - 添加分离实体时延迟加载不起作用

转载 作者:行者123 更新时间:2023-11-30 16:17:03 25 4
gpt4 key购买 nike

我有一个在 .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 并且实体应该是正确的,因为它在我显式加载导航属性时有效。

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

最佳答案

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

entityTwo = _db.EntityTwos.Create();

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

entityId = _db.Entry(entityTwo).Reference(eTwo => eTwo.EntityOne).Query()
.Select(eOne => eOne.EntityId)
.Single();

关于c# - 添加分离实体时延迟加载不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com