2013-02-14 44 views
1

我有以下Linq to SQL结构:我有类“Article”和“User”。每篇文章都有卖家(这是一个用户),每个用户都有很多文章。我用一个关联解决了这个问题。返回LINQ到列表中的SQL关联对象

enter image description here

然后,我有一个方法Read(),它可以获取所有文章并以列表返回。

public static List<Article> Read() 
    { 
     using (DataContext dbx = new DataContext()) 
     {  
      return dbx.Article.ToList(); 
     } 
    } 

所以,现在的问题是:当我在程序的任何地方使用该列表,我想访问article.Seller,我得到以下异常:

无法访问已释放的对象

好吧,这似乎是合法的,因为我返回列表,然后处理DataContext。如果我想访问卖家,它将从数据库中加载,并且不可能再使用处置的DataContext。

所以我解决了延迟加载并将DeferredLoadingEnabled属性设置为false。 要加载卖方,我使用了DataLoadOptions

好吧,那到目前为止,但只在一个级别。现在我可以访问article.Seller了,但如果我想要获得该卖家的其他文章(article.Seller.Articles),我会得到null。 只是装上卖家的物品options.LoadWith<User>(u => u.Articles);我想,但这也是不可能的,因为它是无止境的。

文章 - >卖家 - >文章 - >各条的卖家 - >文章 - >再次卖家 - > ...

我得到的异常

周期中LoadOptions LoadWith类型不允许图形。

我想要的是一种方法来获取所有的文章与正确的关联对象,如我的第一个方法中所示。 关联对象应始终可访问,但只能在访问时从数据库加载。

这将是可能的,如果我在任何地方使用DataContext我需要在程序中的列表,然后只在DataContext中使用列表。 但这会很费力。

你们有没有想法如何在我的程序中无处不在编写我的Read()方法的代码的情况下访问关联对象我需要列表?

回答

1

我也遇到过这个。一般的做法是,如果您打算允许延迟加载,则不要致电Dispose()。实际上,根本不需要拨打Dispose()

关于是否在DataContext上调用Dispose()写了很多。你必须对其进行筛选,但有一篇不错的文章here。基本上,因为DataContext自己管理它的连接,所以它没有任何需要明确处理的连接。