0

ASP.NetWebフォームアプリでコードファーストでEF5を使用しており、「Compleate」というマスターコンテキストを作成しました。これに対してLINQ呼び出しを行うと、すべてが正常に機能します。私が実行しているサーバーには多くのリソースがないため、DBにクエリを実行する必要があるたびに呼び出されるデータの範囲を制限するために、使用する小さなコンテキストを作成しました。問題は、小さいコンテキストに対してLINQ呼び出しを行うと、常にエラーが発生することです。

値をnullにすることはできません。パラメータ名:外部

私はこれを数日間修正しようとしていて、迷子になっています。私の小さな文脈で私が間違っていることについての助けは素晴らしいでしょう。

Compleate.cs(コードファーストマイグレーションを実行および実行するコンテキスト):

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 CODE:

    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コマンドにプライベート修飾子があることがわかります。プライベート修飾子を削除すると、すべてが正常に機能しました。したがって、私の作業コードは次のようになります。

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 に答える