gpt4 book ai didi

c# - 如果在 Entity Framework 中使用延迟加载,如何序列化实体?

转载 作者:太空宇宙 更新时间:2023-11-03 21:00:12 24 4
gpt4 key购买 nike

我刚开始学习 Entity Framework ,我面临着与生成模型序列化相关的问题。我有一对多关系的表,它们是国家和州,因为一个国家有许多州。我使用的是数据库优先方法,当我使用 Entity Framework 创建实体时,Country 类有一个 ICollection 属性。我阅读并发现这是导航属性。让我先展示生成的类,如下所示:

//这是生成的类。

 public class Country
{
public Country()
{
States = new HashSet<States>();
}
public int Id { get; set; }
public string ContryCode { get; set; }
public string ContryName { get; set; }
public virtual ICollection<States> States{ get; set; }

}

我生成模型,然后向前迈进。然后,当我通过 ajax 请求获取国家/地区列表时,我遇到了序列化问题。我用谷歌搜索并找到了一些术语,例如延迟加载、急切加载和 n+1 问题。我详细阅读了它。我找到了一个关闭延迟加载的解决方案。现在的问题是如何使用延迟加载序列化我的模型?

我创建了 MetaData 类并使用了一些属性,如 ignoreXml 等,但没有任何帮助。顺便说一下,我正在使用 Asp.Net MVC 5,我想用延迟加载来序列化我的模型。谁能解释一下?

最佳答案

当您使用延迟加载时,执行会延迟到实际需要该属性的值时。您可能遇到错误,因为在访问属性时上下文已被释放。考虑以下场景:

  • 您有一个名为 Country 的对象,它具有一个名为 States 的延迟加载属性。
  • 您从上下文中获取此对象。
  • 上下文已处理。
  • 您调用 States 属性。
  • 该属性会寻找它来自的上下文。
  • 由于“上下文已被释放”而引发错误。

代码示例:

using(var context = new SomeEntityContext())
{
var country = context.Countries.First();
}

//This will throw an error because the context was disposed of.
var states = country.States;

序列化程序也会抛出错误,因为它将遍历对象的属性,它会找到 States 并尝试获取它的值。

即使上下文仍然存在,您也可能在序列化期间遇到具有导航属性的循环。这是因为两个对象都持有对彼此的引用。考虑以下场景:

  • 您有一个名为 Country 的对象,它具有一个名为 States 的延迟加载属性。
  • 序列化器尝试序列化Country 类型的对象。
  • 它读取 States 集合。
  • 它尝试序列化State 类型的每个对象。
  • 它读取类型为 Country 的属性。
  • 它尝试序列化Country 类型的对象。
  • 它读取 States 集合。
  • 它尝试序列化State 类型的每个对象。
  • 它读取类型为 Country 的属性。
  • 它读取 States 集合。
  • 它尝试序列化State 类型的每个对象。
  • 它读取类型为 Country 的属性。
  • 它读取 States 集合。
  • 它尝试序列化State 类型的每个对象。
  • 它读取类型为 Country 的属性。
  • ....(无限循环,好吧,至少直到你用完堆栈帧)。

或者,您可以创建一个自定义序列化程序来避免导航属性的陷阱,但这可能比它值得做的更多工作。这种方法最适合序列化版本与对象明显不同的情况。

这就是您最好使用数据传输对象 (DTO) 的原因。将数据映射到此对象并通过网络发送。如果您使结构尽可能相似,那么有些组件可以为您进行映射。

查看 AutoMapper:http://automapper.org/

关于c# - 如果在 Entity Framework 中使用延迟加载,如何序列化实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46205458/

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