【问题标题】:The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery', but this dictionary requires a model item of type B传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery”,但此字典需要 B 类型的模型项
【发布时间】:2014-02-02 08:06:57
【问题描述】:

我陷入了困境,我试图在网上找到解决方案,但没有成功。我是使用 Entity Framework 的 MVC 新手,当我尝试运行应用程序时它抛出异常:

传入字典的模型项是类型 'System.Data.Entity.Infrastructure.DbQuery1[<>f__AnonymousType12[UnRelatedEntity.Models.t_AbortReason,UnRelatedEntity.Models.t_Activity]]', 但是这本词典需要一个类型的模型项 'UnRelatedEntity.Models.MobilePhoneXchangeEntities1'

我使用实体作为模型,它分别从两个表中获取数据,它们之间没有关系。

控制器:

public ActionResult Index()
{
    MobilePhoneXchangeEntities1 ent = new MobilePhoneXchangeEntities1();
    var result = from foo in ent.t_AbortReason
                 from bar in ent.t_Activity
                 where foo.AbortReasonCategoryId != null && bar.ActivityId != null
                 select new { Foo = foo, Bar = bar };
    return View(result);
}

查看

@model UnRelatedEntity.Models.MobilePhoneXchangeEntities1

在视图中,我只是在写上面的行,我的意思是我只是在继承模型,没有别的,但我仍然对如何键入 cast model w.r.t model 感到困惑,但我很无助。

任何人都可以在这方面为我提供帮助,但请记住,我在我的模型中使用了两个不相关的表。

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    您的视图需要UnRelatedEntity.Models.MobilePhoneXchangeEntities1 类型的模型,但您将result 对象传递给它。 result 是您在控制器操作中描述的数据库查询。因此,您会得到预期的错误 - 类型不匹配。

    要解决此问题,您应该为查询项创建类型。很简单的例子:

    public class ResultItem
    {
        public Foo Foo { get; set; }
        public Bar Bar { get; set; }
    }
    

    之后修改查询中的 select 语句:

    select new ResultItem { Foo = foo, Bar = bar };
    

    最后,将视图的模型类型更改为IEnumerable<ResultItem>,因为查询将返回结果项的集合。

    【讨论】:

    • 感谢Shad...感谢您的时间、帮助和努力:)
    【解决方案2】:

    正如 Shad 所指出的,您收到此错误的原因仅仅是因为您将不同类型的数据传递到视图中,而不是您所说的。

    为了解决这个问题,您需要一个模型,您可以将它传递到您的视图中,以保存您需要的数据:

    public class FooBarModel
    {
        public AbortReason Foo { get;set;}
        public Activity Bar { get;set;}
    }
    

    然后,在您的 Index 方法中,执行以下操作:

    using(MobilePhoneXchangeEntities1 ent = new MobilePhoneXchangeEntities1())
    {
        var result = from foo in ent.t_AbortReason
                     from bar in ent.t_Activity
                     where foo.AbortReasonCategoryId != null && bar.ActivityId != null
                     select new FooBarModel() { Foo = foo, Bar = bar };
        return View(result);
    }
    

    在你看来,设置模型类型:

    @model IEnumerable<my.namespace.FooBarModel>
    

    【讨论】:

    • Nick,所以我必须创建一个新类来封装 AbortReasonActivity
    • 没错。请记住它的命名空间,您需要它来在视图中设置模型类型。也许只是在你的模型文件夹中创建类。
    • 我对@9​​87654325@ 和Activity 的使用实际上只是从您的查询中推断出来的——您可以将AbortReasonActivity 替换为实际类型。
    • 没问题。编码愉快。
    【解决方案3】:

    没有一个答案对我有用,但最终,出于某种原因,EF 6 似乎将此解释为一个查询:

    var patient = db.Patient.Where(p => p.ID == id);
    

    虽然这返回了我需要并为我工作的模型:

    var patient = db.Patient.Where(p => p.ID == id).FirstOrDefault();
    

    【讨论】:

    • 这对我有用。实际上,我在 ViewModel 上声明了一个 IEnumerable,但我传递了一个 IQueryable(您的第一个示例)。只是用 ToList() 设置我的查询(类似于你的第二个例子)解决了这个问题。
    • 你应该改用我的方法,IEnum 每次添加东西时都会创建一个新的内存使用堆栈,而 EF6 也会这样做,所以让 EF6 处理这部分,否则它的双重工作您的应用程序
    • 我没听懂你在说什么。我正在使用你的方法。在您的第一行代码中,您的 var 是一个 IQueryable(这就是 EF 将其解释为查询的原因),而在您的第二行中,您的 var 是一个对象。我们的代码之间的唯一区别是你只得到一个病人,而我得到一个病人的 IEnumerable(列表)。两个代码都创建了一个新的内存堆栈。
    • 是的,谢谢你教了我一些新东西,第一个可能已经被 Microsogt 在 EF 中修复了
    【解决方案4】:

    传入字典的模型项是“Person.Models.Location”类型的,但该字典需要一个“Person.Models.LoginModel”类型的模型项。

    【讨论】:

      【解决方案5】:

      添加具有正确类型的新对象或实例

      @Html.Partial("_LoginPartial", new MVCTest.Models.LoginViewModel())

      【讨论】:

        【解决方案6】:

        您正在尝试将异常插入到您的数据库中。

        要查看确切的错误,您应该有如下内容:

        private DbCtx db = new DbCtx();
        
        try
        {
            ctx.SaveChanges();
            base.Seed(ctx);
        }
        catch (DbEntityValidationException ex)
        {
            string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.PropertyName + ": " + x.ErrorMessage));
            throw new DbEntityValidationException(errorMessages);
        }
        

        其中DbCtx 是您的数据库构建类。

        【讨论】:

          猜你喜欢
          • 2020-09-08
          • 2013-10-18
          • 1970-01-01
          • 1970-01-01
          • 2013-10-17
          • 2015-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多