1

错误:传递到字典中的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery (snip) ...寻找类型“Advocate”

控制器方法如下所示:

[HttpGet]
public ActionResult AdvocateEdit(int id)
{
    var advocate = from a in db.Query<Advocate>().Include(a => a.AdvocateId)
                   where (a.AdvocateId == id)
                   select a;

    return View(advocate);
}

该视图确实是输入到 Advocate @model 的,并且在逐步完成之后,我很确定问题出在这个查询上。它返回时需要是 Advocate 类型。

db.Query is an IQueryable<T> method in my DbContext that returns Set<T>().

如果需要更多信息,请告诉我。感谢人们

添加 - -

数据库上下文.cs

public interface IAcmeDb : IDisposable
{
    IQueryable<T> Query<T>() where T : class;
}

public class AcmeDb : DbContext, IAcmeDb
{
    public AcmeDb() : base("name=AcmeDB") {}
    public DbSet<Advocate> Advocates { get; set; }

    IQueryable<T> IAcmeDb.Query<T>()
    {
         return Set<T>();
    }
}
4

3 回答 3

4

我认为您想将 Advocate 元素传递给视图,而不是查询本身。尝试这个:

return View(advocate.First());

代码中的 advocate 对象是 IQueryable 类型,如果您的视图需要 Advocate 对象,只需使用 First() 或 FirstOrDefault() 获取查询的第一个元素。

于 2013-07-30T22:52:12.817 回答
3

如果您的视图需要单个Advocate并且给定 id 始终只有一个实体,那么您需要:

[HttpGet]
public ActionResult AdvocateEdit(int id)
{
   try
   {
       Advocate advocate = db.Query<Advocate>().Single(a => a.AdvocateId == id);
       return View(advocate);
   }
   catch(InvalidOperationException ex)
   {
      //handle the case where no entity matches the supplied id (return status code 404?), or
      //there are no Advocates at all (redirect to a create page?), or
      //more than one entity matches (return status code 500)
   }
}
于 2013-07-30T23:30:31.597 回答
2

至少有一个值得注意的问题。LINQ 倾向于使用延迟执行。我在您的代码中没有看到您强制执行查询。除非您在某处View(advocate)枚举IEnumberable<T>查询产生的内容,否则您将不会处理 type 的对象Advocate

我建议在查询末尾添加一个ToList()ToArray()调用,这将确保它实际被执行。如果这不起作用,我会将查询分开,并确保db.Query<Advocate>()返回您所期望的。

   List<Advocate> = db.Query<Advocate>().Include(a => a.AdvocateId)
                    .Where(a.AdvocateId == id)
                    .Select(a => a).ToList();

我已将您的查询转换为方法语法,因为它是我熟悉的。上面的例子可能会解决你的问题。我认为要保留查询语法,您应该将整个左侧放在父母中,然后继续ToList()调用,但是我不确定正确的语法是什么。

编辑:根据其他评论,问题不是延迟执行,而是尝试将集合传递给寻找单个实例的方法。使用上面相同的代码,您只需将 to 更改ToList()FirstOrDefault()您的代码即可;

List<Advocate> = db.Query<Advocate>().Include(a => a.AdvocateId)
                        .Where(a.AdvocateId == id)
                        .Select(a => a).FirstOrDefault();

注意:引用类型的默认值是null,如果您没有适当的空值检查,这当然可能会给您带来问题。

于 2013-07-30T22:38:22.133 回答