EF SingleOrDefault 不适用于 ASP.NET

发布于 2024-11-01 05:06:29 字数 5004 浏览 0 评论 0原文

我为我的项目编写了一些单元测试,用于测试我的演示者,这些演示者使用 SingleOrDefault 查询 EF 上下文,所有单元测试都成功。但是,当我运行 ASP.NET 应用程序时,我不断收到错误“Linq to Entities 不支持'Single'?”我想知道为什么会出现这种行为?我找不到有关此行为的任何文档。

我使用以下代码:

Presenter:

public class ManagedQueryPresenter : BasePresenterMetModel<IManagedQueriesView, ManagedQueryBeheerModel>, IWebPartPresenter
    {
        public ManagedQueryPresenter(IManagedQueriesView view) : base(view, new ManagedQueryBeheerModel()) { }

        #region IPagePresenter Members

        public void OnViewInitialize()
        {

        }

        public void OnViewInitialized()
        {

        }

        public void OnViewLoaded()
        {

        }

        #endregion

        public void OnManagedQueriesSelecting()
        {
            View.ManagedQueries = Model.GetAll();
        }

        public void OnManagedQueryInserted(ManagedQuery entity)
        {
            Model.AddManagedQuery(entity);
            View.ManagedQueries = Model.GetAll();
        }

        public void OnManagedQueryUpdated(ManagedQuery entity)
        {
            Model.UpdateManagedQuery(entity);
        }

        public void OnManagedQueryDeleted(ManagedQuery entity)
        {
            Model.DeleteManagedQuery(entity);
        }
    }

Model:

public class ManagedQueryBeheerModel : BaseModel, IModel
{
    public void AddManagedQuery(ManagedQuery entity)
    {
        ...
    }

    public void DeleteManagedQuery(ManagedQuery entity)
    {
        ...
    }

    public void UpdateManagedQuery(ManagedQuery entity)
    {
        DoEntityAction<bool>(context =>
        {
            ManagedQuery toUpdate = context.ManagedQueries.Include(q => q.ManagedQueryParameters).SingleOrDefault(x => x.ID == entity.ID);

            ...

            context.SaveChanges();

            return true;
        });
    }

    public IList<ManagedQuery> GetAll()
    {
        return DoRepositoryAction<ManagedQuery, List<ManagedQuery>>(repository => (List<ManagedQuery>)repository.GetAll());
    }

    public ManagedQuery Get(long ID)
    {
        return DoRepositoryAction<ManagedQuery, ManagedQuery>(repository => repository.GetSingleOrDefault(x => x.ID == ID));
    }
}

UnitTest:

    [TestMethod()]
    public void OnManagedQueryUpdatedTest()
    {
        IManagedQueriesView view = new MockedManagedQueriesView(); 
        ManagedQueryPresenter target = new ManagedQueryPresenter(view);
        ManagedQuery entity = ManagedQueryHelper.CreateNewRecord(target.Model);
        entity.Name += "Updated";
        target.OnManagedQueryUpdated(entity);
    }

public static class ManagedQueryHelper
    {
        public static ManagedQuery CreateNewRecord(ManagedQueryBeheerModel model)
        {
            ManagedQuery entity = new ManagedQuery
            {
                Description = "Test Query",
                Name = "Test",
                QueryText = @"SOME QUERY",
                HasOutput = true,
                Category = "Test",
            };
            model.AddManagedQuery(entity);
            return entity;
        }
    }

ASP.NET View (Codebehind of ascx):

public partial class ManagedQueriesUserControl : WebPartMangedUserControlWithPresenter<ManagedQueryPresenter>, IManagedQueriesView
    {
        protected ASPxGridView _grid;
        protected ObjectContainerDataSource _ocdsManagedQueries;

        #region IServicesView Members

        public IList<Entities.ManagedQuery> ManagedQueries
        {
            set 
            {
                _grid.ForceDataRowType(typeof(ManagedQuery));
                _ocdsManagedQueries.DataSource = value; 
            }
        }

        #endregion

        protected void _ocdsManagedQueries_Deleted(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryDeleted((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Updated(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryUpdated((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Inserted(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryInserted((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Selecting(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceSelectingEventArgs e)
        {
            Presenter.OnManagedQueriesSelecting();
        }

        #region IWebPartView Members

        public bool IsValid()
        {
            return Page.IsValid;
        }

        public string ErrorText
        {
            set { }
        }

        #endregion
    }

I've wrote some unit-tests for my project who tests my presenters, these presenters queries an EF context with SingleOrDefault, all the unit-tests are successful. But when I run my ASP.NET application I get continuously the error "'Single' not supported by Linq to Entities?" I want to know why this behavior is kicking in? I can't find any documentation about this behavior.

I use the following code:

Presenter:

public class ManagedQueryPresenter : BasePresenterMetModel<IManagedQueriesView, ManagedQueryBeheerModel>, IWebPartPresenter
    {
        public ManagedQueryPresenter(IManagedQueriesView view) : base(view, new ManagedQueryBeheerModel()) { }

        #region IPagePresenter Members

        public void OnViewInitialize()
        {

        }

        public void OnViewInitialized()
        {

        }

        public void OnViewLoaded()
        {

        }

        #endregion

        public void OnManagedQueriesSelecting()
        {
            View.ManagedQueries = Model.GetAll();
        }

        public void OnManagedQueryInserted(ManagedQuery entity)
        {
            Model.AddManagedQuery(entity);
            View.ManagedQueries = Model.GetAll();
        }

        public void OnManagedQueryUpdated(ManagedQuery entity)
        {
            Model.UpdateManagedQuery(entity);
        }

        public void OnManagedQueryDeleted(ManagedQuery entity)
        {
            Model.DeleteManagedQuery(entity);
        }
    }

Model:

public class ManagedQueryBeheerModel : BaseModel, IModel
{
    public void AddManagedQuery(ManagedQuery entity)
    {
        ...
    }

    public void DeleteManagedQuery(ManagedQuery entity)
    {
        ...
    }

    public void UpdateManagedQuery(ManagedQuery entity)
    {
        DoEntityAction<bool>(context =>
        {
            ManagedQuery toUpdate = context.ManagedQueries.Include(q => q.ManagedQueryParameters).SingleOrDefault(x => x.ID == entity.ID);

            ...

            context.SaveChanges();

            return true;
        });
    }

    public IList<ManagedQuery> GetAll()
    {
        return DoRepositoryAction<ManagedQuery, List<ManagedQuery>>(repository => (List<ManagedQuery>)repository.GetAll());
    }

    public ManagedQuery Get(long ID)
    {
        return DoRepositoryAction<ManagedQuery, ManagedQuery>(repository => repository.GetSingleOrDefault(x => x.ID == ID));
    }
}

UnitTest:

    [TestMethod()]
    public void OnManagedQueryUpdatedTest()
    {
        IManagedQueriesView view = new MockedManagedQueriesView(); 
        ManagedQueryPresenter target = new ManagedQueryPresenter(view);
        ManagedQuery entity = ManagedQueryHelper.CreateNewRecord(target.Model);
        entity.Name += "Updated";
        target.OnManagedQueryUpdated(entity);
    }

public static class ManagedQueryHelper
    {
        public static ManagedQuery CreateNewRecord(ManagedQueryBeheerModel model)
        {
            ManagedQuery entity = new ManagedQuery
            {
                Description = "Test Query",
                Name = "Test",
                QueryText = @"SOME QUERY",
                HasOutput = true,
                Category = "Test",
            };
            model.AddManagedQuery(entity);
            return entity;
        }
    }

ASP.NET View (Codebehind of ascx):

public partial class ManagedQueriesUserControl : WebPartMangedUserControlWithPresenter<ManagedQueryPresenter>, IManagedQueriesView
    {
        protected ASPxGridView _grid;
        protected ObjectContainerDataSource _ocdsManagedQueries;

        #region IServicesView Members

        public IList<Entities.ManagedQuery> ManagedQueries
        {
            set 
            {
                _grid.ForceDataRowType(typeof(ManagedQuery));
                _ocdsManagedQueries.DataSource = value; 
            }
        }

        #endregion

        protected void _ocdsManagedQueries_Deleted(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryDeleted((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Updated(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryUpdated((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Inserted(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryInserted((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Selecting(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceSelectingEventArgs e)
        {
            Presenter.OnManagedQueriesSelecting();
        }

        #region IWebPartView Members

        public bool IsValid()
        {
            return Page.IsValid;
        }

        public string ErrorText
        {
            set { }
        }

        #endregion
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乞讨 2024-11-08 05:06:29

我相信您可以在此线程上找到答案 错误,方法不受支持实体的 LINQ

I believe you can find the answer on this thread Error, method not supported by LINQ to Entities

走走停停 2024-11-08 05:06:29

我忘记了 VS2010 中的单元测试默认是用 .NET 4 编写的,而我的代码是用 .NET3.5 编写的,因此它不起作用。在 EF4 中支持 Single(OrDefault)!

I was forgotten that unittests are by default in VS2010 written in .NET 4 and my code in .NET3.5 so therefore it isn't working. In EF4 Single(OrDefault) is supported!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文