0

我在我的 ASP.Net Web 窗体应用程序中使用 EF 5 和 Code First,并创建了一个名为“Compleate”的主上下文,每当我对它进行 LINQ 调用时,一切正常。因为我运行的服务器没有很多资源,所以我创建了更小的上下文来限制每次我需要查询数据库时调用的数据范围。问题是,当我针对较小的上下文进行 LINQ 调用时,我总是会收到错误消息

值不能为空。参数名称:外层

这几天我一直在尝试解决这个问题,但我迷路了。对于我在较小的环境中做错的事情的任何帮助都会很棒。

Compleate.cs(适用于并运行 Code First 迁移的上下文):

using FFInfo.DAL.Tables;
using System.Data.Entity;

namespace FFInfo.DAL
{
    public class Compleate : DbContext
    {
        public Compleate() : base("FFInfoDB") { }

        //General Tables
        public DbSet<File> Files { get; set; }
        public DbSet<Culture> Cultures { get; set; }
        public DbSet<Section> Sections { get; set; }
        public DbSet<Navigation> Navigation { get; set; }

        //Locale Tables
        public DbSet<Locale_Section> Locale_Sections { get; set; }
    }
}

Base.cs(所有较小的上下文都继承自此):

using System.Data.Entity;

namespace FFInfo.DAL
{
    public class Base<TContext> : DbContext where TContext : DbContext
    {
        static Base()
        {
            Database.SetInitializer<TContext>(null);
        }

        protected Base() : base("FFInfoDB") { }
    }
}

SiteNavigation.cs(我试图从中读取的较小上下文):

using FFInfo.DAL.Tables;
using System.Data.Entity;

namespace FFInfo.DAL
{
    public class SiteNavigation : Base<SiteNavigation>
    {
        public DbSet<Navigation> Navigation { get; private set; }
        public DbSet<Section> Sections { get; private set; }
        public DbSet<Locale_Section> SectionTranslations { get; private set; }
    }
}

LINQ 代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        rpBooks.DataSource = PopulateNav("Book", 1);
        rpBooks.DataBind();
    }

    protected object PopulateNav(string Category, byte Culture)
    {
        using (var db = new SiteNavigation())
        {
            return (from n in db.Navigation
                    join st in db.SectionTranslations on n.SectionID equals st.Section.SectionID
                    where n.Category == Category && st.CultureID == Culture
                    select new
                    {
                        LinkAddress = st.Section.Type + "/" + st.Section.RouteName,
                        st.Title
                    }).ToList();
        }
    }
4

1 回答 1

0

我今晚想通了。如果您查看 SiteNavigation.cs,您会发现我在每个 DBSet 的 SET 命令上都有 private 修饰符。当我删除私有修饰符时,一切正常。所以我的工作代码现在看起来像:

using FFInfo.DAL.Tables;
using System.Data.Entity;

namespace FFInfo.DAL
{
    public class SiteNavigation : Base<SiteNavigation>
    {
        public DbSet<Navigation> Navigation { get; set; }
        public DbSet<Section> Sections { get; set; }
        public DbSet<Locale_Section> SectionTranslations { get; set; }
    }
}
于 2013-03-06T01:52:39.153 回答