实体框架 - 自我引用

时间:2016-10-07 08:22:30

标签: c# sql entity-framework

我在实体框架中有一个关于自引用的问题,只是为了确定应用程序的负载。

不幸的是我在桌子上有一些关系。 因此,我有一些自引用对象。 例如: 公司有一些客户,客户属于某些条目,这些条目映射到包含不同客户的公司......

(公司 - >客户 - >条目 - >公司 - >客户......)

当我想在json字符串中序列化时,我将收到有关自引用循环的错误消息(很明显) 通过使用实体框架进行此查询,我没有收到错误消息。 但是当我查看调试器时,我可以看到“循环”。

我的问题: 它是否会导致我的服务器出现高性能负载? 或者这是不同的处理,所以我可以忽略c#中的这个自引用?

否则我认为我必须对表格中的关系进行更改......

我只是想在表格中有更多条目时防止服务器负载出现问题。

提前致谢。

1 个答案:

答案 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或手动),然后安全地序列化。