我在实体框架中有一个关于自引用的问题,只是为了确定应用程序的负载。
不幸的是我在桌子上有一些关系。 因此,我有一些自引用对象。 例如: 公司有一些客户,客户属于某些条目,这些条目映射到包含不同客户的公司......
(公司 - >客户 - >条目 - >公司 - >客户......)
当我想在json字符串中序列化时,我将收到有关自引用循环的错误消息(很明显) 通过使用实体框架进行此查询,我没有收到错误消息。 但是当我查看调试器时,我可以看到“循环”。
我的问题: 它是否会导致我的服务器出现高性能负载? 或者这是不同的处理,所以我可以忽略c#中的这个自引用?
否则我认为我必须对表格中的关系进行更改......
我只是想在表格中有更多条目时防止服务器负载出现问题。
提前致谢。
答案 0 :(得分:0)
我认为关于Lazy Loading的文章会对您有所帮助。看看下一部分
延迟加载是在第一次访问引用实体/实体的属性时从数据库自动加载实体或实体集合的过程。使用POCO实体类型时,通过创建派生代理类型的实例,然后覆盖虚拟属性以添加加载钩子来实现延迟加载。
...
延迟加载和序列化不能很好地混合,如果你不小心,你最终只能因为启用了延迟加载而查询整个数据库。大多数序列化程序通过访问类型实例上的每个属性来工作。属性访问触发延迟加载,因此更多实体被序列化。在这些实体上访问属性,甚至加载更多实体。
为您解答性能问题 - 只有在您访问属性框架时,实体框架才会为您引用的属性加载数据。
如果要序列化Entity Framework类,可以禁用LazyLoading,而不是只加载要序列化的数据
public Company GetCompany(int id)
{
using (var context = new DBData())
{
context.Configuration.LazyLoadingEnabled = false;
return context.Set<Company>()
.Include(x => x.Customer)//you can add other includes which you want
.Where(x => x.Id == id).FirstOrDefault();
}
}
但我强烈建议创建其他类,只包含您想要序列化的属性,将数据从EF类映射到新类(使用AutoMapper或手动),然后安全地序列化。