【问题标题】:The best overloaded method match for XXX has some invalid argumentsXXX 的最佳重载方法匹配有一些无效参数
【发布时间】:2013-02-11 23:31:58
【问题描述】:

我是实体框架的新手。

我尝试编写以下方法,但出现编译时错误。

 protected static void EntitySQLQuery(AWEntities context)
        {
            string cmd = @"SELECT VALUE c FROM AWEntities.Person AS c WHERE c.FirstName = @FirstName";

            ObjectQuery<Person> persons = new ObjectQuery<Person>(cmd, context);//Error


        }

最好的重载方法匹配 'System.Data.Objects.ObjectQuery.ObjectQuery(字符串, System.Data.Objects.ObjectContext)' 有一些无效参数

【问题讨论】:

  • 第一个参数看起来不错,那么你有没有想过你的AWEntities是否真的是System.Data.Objects.ObjectContext?根据错误文本,这个构造函数的第二个参数必须是System.Data.Objects.ObjectContext
  • @JeppeStigNielsen :: AWEntities 是继承自 DbContext 的公共类
  • 当你说DbContext时,是System.Data.Entity.DbContext吗?因为该类并非按照构造函数签名的要求从System.Data.Objects.ObjectContext 派生。

标签: c# asp.net entity-framework visual-studio-2012 entity-framework-5


【解决方案1】:

您的AWEntities context 对象未被识别为ObjectContext。请检查您的对象的类型。看看ObjectContextObjectQuery's constructor的定义

【讨论】:

  • AWEntities是一个继承自DbContext的公共类
【解决方案2】:

这是 Entity Framework 比较令人困惑的地方之一。您必须意识到 ObjectContext 是执行 EntityFramework 的旧方式,大约在 2010 年。这是在 DbContext 之前(和代码优先)。您仍然可以通过将 DbContext 转换为 IOjbectContextAdapter 来访问 ObjectContext,如下所示:

((IObjectContextAdapter)context).ObjectContext;

这将使您的查询看起来像这样:

ObjectQuery<Person> persons = new ObjectQuery<Person>(cmd, ((IObjectContextAdapter)context).ObjectContext);

我不知道实体结构化查询是否被提升了。我会考虑尽可能使用 LInQ。

var firstname = "Fred";
return from person in AWEntities.Person
       where person.FirstName = firstname
       select person;

如果您正在阅读 Julie Lerman 的书,我强烈建议您阅读所有三本书。第一个是解释所有基础知识的巨大坟墓(并且围绕 ObjectContext 做事方式编写),后两个对于当今的代码优先/dbcontext 世界更为实用。

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 2018-07-14
    • 2013-01-07
    • 2014-05-17
    • 1970-01-01
    • 2014-04-14
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多