传递到字典中的模型项的类型为'System.Data.Entity.Infrastructure.DbQuery',但此字典需要B类型的模型项

时间:2014-01-14 10:00:58

标签: c# asp.net-mvc

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

  

传递到字典中的模型项是类型的   'System.Data.Entity.Infrastructure.DbQuery 1[<>f__AnonymousType1 2 [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

在视图中我只是写上面这一行,我的意思是我只是继承模型,没有其他但我仍然对如何键入演员模型w.r.t模型感到困惑,但我很无奈。

任何人都可以请我帮忙,但请记住我在模型中使用两个不相关的表格。

6 个答案:

答案 0 :(得分:3)

正如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>

答案 1 :(得分:2)

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

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

虽然这返回了我需要的模型并且适合我:

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

答案 2 :(得分: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>,因为查询将返回结果项的集合。

答案 3 :(得分:0)

传递到字典中的模型项类型为&#39; Person.Models.Location&#39;,但此字典需要类型为&#39; Person.Models.LoginModel&#39;的模型项。

答案 4 :(得分:0)

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

@ Html.Partial(“_ LoginPartial”,新的MVCTest.Models.LoginViewModel())

答案 5 :(得分:0)

您正在尝试向数据库中插入异常。

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

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 是您的数据库构建类。