gpt4 book ai didi

c# - Entity Framework 延迟加载和更新模型

转载 作者:行者123 更新时间:2023-11-30 21:10:55 26 4
gpt4 key购买 nike

我已经定义了一些这样的模型( Entity Framework 代码优先):

public class A
{
public int Id { get; set; }
public int Name { get; set; }
}

public class B
{
public int Id { get; set; }
public int Name { get; set; }
public virtual A ObjectA { get; set; }
}

// model update sample code
public void UpdateModel(int id, string name)
{
B objB = GetObjBByIdUsingLINQ(id); // this function gets the object using LINQ
if (objB != null) // <-- if you do a breakpoint here and inspect objB, objB.A != null
{
objB.Name = name;
dbContext.Entry(objB).State = EntityState.Modified;
dbContext.SaveChanges(); // <-- DbEntityValidationException here because objB.A == null
}
}

当我从数据库加载模型 B 时,我只更改名称并更新它,我收到以下错误:需要 ObjectA 字段。

我认为这是因为 ObjectA 是延迟加载的。但是,当我从数据库中加载B后添加断点,然后在变量资源管理器中查看B的内容时,会加载A,更新B不会报错。

有什么办法解决这个问题吗?

最佳答案

发生的事情是,当您在断点处停止并检查 objB 中的属性 ObjectA 的值时,您正在显式加载该属性。

GetObjBByIdUsingLINQ(id) 方法中,您应该使用 Include 来加载您的属性,例如:

var objB = from b in dbContext.Bs.Include("ObjectA")
where b.Id == id
select b;

或者您可以显式加载属性:

dbContext.Entry(objB).Reference("ObjectA").Load();

您应该注意,第一个选项只会访问数据库一次。在第二个选项中,您将访问数据库两次。应根据您的具体情况考虑这一点。
您可以在这篇博文中阅读有关使用相关实体的所有信息: Using DbContext in EF 4.1 Part 6: Loading Related Entities .

关于c# - Entity Framework 延迟加载和更新模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8225781/

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