Sql server 循环引用和堆栈溢出异常

Sql server 循环引用和堆栈溢出异常,sql-server,asp.net-mvc,linq,Sql Server,Asp.net Mvc,Linq,我在KundeInfo和HovedKategori之间有这样的多对多关联,我在我的MS SQL数据库中映射了这样的关联: 我已经实施了KundeInfo.HovedKategoris的方法: public IEnumerable<KundeInfo> KundeInfos { get { using (var dc = new DataClassesBSMAKSDataContext()) { dc.Defer

我在KundeInfo和HovedKategori之间有这样的多对多关联,我在我的MS SQL数据库中映射了这样的关联:

我已经实施了KundeInfo.HovedKategoris的方法:

public IEnumerable<KundeInfo> KundeInfos
{
    get
    {
        using (var dc = new DataClassesBSMAKSDataContext())
        {
            dc.DeferredLoadingEnabled = false;
            var kundeInfoHovedKategoris = dc.KundeInfoHovedKategoris.Where(x => x.HovedKategori_Id == Id);
            var kundeInfos = dc.KundeInfos.Where(x => kundeInfoHovedKategoris.Any(y => y.KundeInfo_Id == x.Id));

            return kundeInfos.ToList();
        }
    }
}
公共IEnumerable KundeInfos
{
得到
{
使用(var dc=new DataClassesBSMAKSDataContext())
{
dc.DelferredLoadingEnabled=假;
var kundeInfoHovedKategoris=dc.kundeInfoHovedKategoris.Where(x=>x.HovedKategori_Id==Id);
var kundeInfos=dc.kundeInfos.Where(x=>kundeinfovovedkategoris.Any(y=>y.KundeInfo_Id==x.Id));
返回kundeInfos.ToList();
}
}
}
。。。和HovedKategori.KundeInfos:

public IEnumerable<HovedKategori> HovedKategoris
{
    get
    {
        using (var dc = new DataClassesBSMAKSDataContext())
        {
            var kundeInfoHovedKategoris = dc.KundeInfoHovedKategoris.Where(x => x.KundeInfo_Id == Id);
            var hovedKategoris = dc.HovedKategoris.Where(x => kundeInfoHovedKategoris.Any(y => y.HovedKategori_Id == x.Id));

            return hovedKategoris.ToList();
        }
    }
}
public IEnumerable HovedKategoris
{
得到
{
使用(var dc=new DataClassesBSMAKSDataContext())
{
var kundeInfoHovedKategoris=dc.kundeInfoHovedKategoris.Where(x=>x.KundeInfo_Id==Id);
var hovedKategoris=dc.hovedKategoris.Where(x=>kundeinfovovedkategoris.Any(y=>y.HovedKategori_Id==x.Id));
return hovedKategoris.ToList();
}
}
}
这将从特定的HovedKategori和对立面检索相关的KundeInfos。然而,问题在于序列化。当我调用ToList()或将这些对象序列化为JSON时,linq将首先尝试跟踪由HovedKategori.KundeInfo返回的所有引用,如果是我首先调用的方法,那么它将针对每个返回的对象,尝试跟踪由KundeInfo.HovedKategoris返回的所有引用,以此类推,直到它抛出堆栈溢出异常

如果我能以某种方式阻止linq使用[Ignore]属性或其他东西跟踪某些属性,它会起作用,但我还没有找到类似的东西


在这种情况下我能做什么?

这部分是设计问题。你真正应该问自己的是,你是否需要在每一个可能的方向导航属性。例如,如果您只是添加了一个Kategori ID而不是导航属性,您仍然可以(通过使用该ID)查询您的上下文,但是您真的需要始终获取包含所有基础数据的所有Kategori吗


另外,如果将属性设置为虚拟属性,则会延迟加载,并且只有在需要时才会获取信息。包括它或显式引用它。

好的-因此,我通过将其设置为相应类上的方法来解决此问题,因为它从数据库中检索了这些实体,因此首先应该将其设置为相应类上的方法。是的,部分是设计问题

虚拟不起作用,我考虑过使用投影和抽象类,但这将是一个继承和类强制转换的大草堆,甚至不值得考虑

public IEnumerable<KundeInfo> KundeInfos()
{

    using (var dc = new DataClassesBSMAKSDataContext())
    {
        var kundeInfoHovedKategoris = dc.KundeInfoHovedKategoris.Where(x => x.HovedKategori_Id == Id);
        var kundeInfos = dc.KundeInfos.Where(x => kundeInfoHovedKategoris.Any(y => y.KundeInfo_Id == x.Id));

        return kundeInfos.ToList();
    }
}
public IEnumerable KundeInfos()
{
使用(var dc=new DataClassesBSMAKSDataContext())
{
var kundeInfoHovedKategoris=dc.kundeInfoHovedKategoris.Where(x=>x.HovedKategori_Id==Id);
var kundeInfos=dc.kundeInfos.Where(x=>kundeinfovovedkategoris.Any(y=>y.KundeInfo_Id==x.Id));
返回kundeInfos.ToList();
}
}

调用
ToList()
时,您确定得到了SO吗?JSON序列化使用什么?我的理解是,当调用ToList时,Linq会遍历对象的分支及其属性,就像它从Linq结果集生成一个列表一样。堆栈溢出异常在我调用ToList时,或者在我使用Newtonsoft.Json序列化对象时正确抛出。我甚至告诉Newtonsoft.Json不要遵循引用,但这并不重要,因为似乎是linq导致了循环引用的发生