【问题标题】:ASP.Net Entity Framework Repository & LinqASP.Net 实体框架存储库和 Linq
【发布时间】:2010-06-16 17:16:28
【问题描述】:

我的场景:

这是一个通过 C# 编程的 ASP.NET 4.0 Web 应用程序

我实现了一个存储库模式。我的存储库都共享相同的ObjectContext,它存储在 httpContext.Items 中。每个存储库都会创建一个 E 类型的新 ObjectSet。以下是我的存储库中的一些代码:

public class Repository<E> : IRepository<E>, IDisposable
    where E : class
{
    private DataModelContainer _context = ContextHelper<DataModelContainer>.GetCurrentContext();
    private IObjectSet<E> _objectSet;
    private IObjectSet<E> objectSet
    {
        get
        {
            if (_objectSet == null)
            {
                _objectSet = this._context.CreateObjectSet<E>();
            }
            return _objectSet;
        }
    }

    public IQueryable<E> GetQuery()
    {
        return objectSet;
    }

假设我有 2 个存储库,1 个用于州,1 个用于国家,并且想要针对两者创建一个 linq 查询。请注意,我将 POCO 类与实体框架一起使用。 State 和 Country 是这些 POCO 类中的 2 个。

Repository stateRepo = new Repository<State>();
Repository countryRepo = new Repository<Country>();

IEnumerable<State> states = (from s in _stateRepo.GetQuery()
                             join c in _countryRepo.GetQuery() on s.countryID equals c.countryID
                             select s).ToList();
Debug.WriteLine(states.First().Country.country)

基本上,我想检索州和相关国家实体。查询只返回状态数据...我在Debug.WriteLine 上得到一个空参数异常

LazyLoading 在我的 .edmx 中被禁用...这就是我想要的方式。

【问题讨论】:

    标签: asp.net linq entity-framework linq-to-entities repository


    【解决方案1】:

    您正在执行连接,但没有从中检索任何内容。您的问题有多种解决方案:

    • 使用Include 加载依赖实体:from s in ((ObjectSet&lt;State&gt;) _stateRepo.GetQuery).Include("Country")。这种方法的问题在于,如果您想避免强制转换,您应该直接公开 ObjectSet 而不是 IQueryable
    • 使用context.LoadProperty(states.First(), s =&gt; s.Country) 从数据库中显式加载给定州的国家/地区。
    • 在查询中选择两个实体:from s in ... join c ... select new { s, c }。您将无法直接访问该州的 Country 属性,但您拥有匿名类型。
    • 启用延迟加载。

    【讨论】:

    【解决方案2】:

    您的存储库实现与我的非常相似,尤其是您存储 ObjectContext 的方式。它对我来说很好,所以我不认为这是一个概念问题。

    尝试使用静态对象上下文(无包装),看看是否能解决问题。也许您的 ContextHelper 中存在一个错误,导致您的上下文被处理和重新创建。

    【讨论】:

    • 我 Debug.WriteLine 每次创建一个新的 ObjectContext 并且肯定它工作正常。您的项目中是否启用了延迟加载?
    • 我们禁用它是因为我们的应用程序是 n 层并且不希望其他层能够以这种方式运行查询
    • @Chris Klepeis:抱歉,我错过了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多