【问题标题】:The model item passed into the dictionary is of type 'System.Data.Entity.DynamicProxies.Survey_D8传入字典的模型项的类型为 'System.Data.Entity.DynamicProxies.Survey_D8
【发布时间】:2017-03-28 11:43:29
【问题描述】:

我有一个错误。这是

传入字典的模型项的类型为“System.Data.Entity.DynamicProxies.Survey_D8226C5F5E348399740EDE08FDF0A956BDAD893915272C075AF983B0C50DA25E”, 但是这本词典需要一个“SurveySpaceProject.Models.User”类型的模型项。

我正在从数据库中进行调查,但它需要用户。我尝试了 Stackoverflow 的一些解决方案,但没有办法。你能帮我吗?这不是家庭作业。这是我的项目,我在 1 周前开始使用 asp.net。

My View

       public ActionResult FillSurvey(int id)
        {
            var s = SSPEntity.getDB().Surveys.FirstOrDefault(x => x.ID == id);
            return View(s);
        }

我的 FillSurvey 页面:

       @model SurveySpaceProject.Models.Survey

     @{
    ViewBag.Title = "FillSurvey";
    }

    <h2>FillSurvey</h2>

    <div>
    <h4>Survey</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.User.UserName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.User.UserName)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.CreatedDate)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.CreatedDate)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.IsDeleted)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.IsDeleted)
        </dd>

       </dl>
      </div>
       <p>
        @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
        @Html.ActionLink("Back to List", "Index")
      </p>

还有我的调查模型

            namespace SurveySpaceProject.Models
         {
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    public partial class Survey
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Survey()
        {
            SurveyAnswers = new HashSet<SurveyAnswer>();
            SurveyQuestions = new HashSet<SurveyQuestion>();
            //SurveyUsers = new HashSet<SurveyUser>();
        }

        public int ID { get; set; }

        public int UserID { get; set; }

        [Required]
        [StringLength(150)]
        public string Title { get; set; }

        [Column(TypeName = "date")]
        public DateTime? CreatedDate { get; set; }

        public bool IsDeleted { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<SurveyAnswer> SurveyAnswers { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<SurveyQuestion> SurveyQuestions { get; set; }

        public virtual User User { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<SurveyUser> SurveyUsers { get; set; }
    }
}

【问题讨论】:

  • 你在哪里得到错误?究竟在哪部分代码?
  • 您发布的视图使用Survey 作为其模型。获得此特定异常的唯一方法是,如果实际使用的视图具有 User 作为其模型。换句话说,您要么没有加载您认为的视图,要么您没有发布重要的实际视图的代码。
  • This Q/A 解释了错误,但您没有向我们显示正确的代码(您显示的内容不会产生该错误)。该错误清楚地表明您调用了具有@model SurveySpaceProject.Models.User 的视图(而不是您所显示的Survey
  • 如果我通过了调查以外的任何内容,错误状态我需要调用“调查”。但是,如果我将调查作为模型传递,它会说明该错误。

标签: c# asp.net-mvc asp.net-mvc-3


【解决方案1】:

您有 2 个问题:

第 1 期

您传递给视图的部分类和模型位于命名空间namespace SurveySpaceProject.Models,但您的查询返回的Survey 位于另一个命名空间中。因此,它们是不同的类型。确保铭牌相同。这就是错误所指示的。

问题 2

您必须急切地加载User 属性。像这样使用Include

var s = SSPEntity.getDB().Surveys.Include(x =>   
    x.User).FirstOrDefault(x => x.ID == id);

现在 EF 将生成一个查询,因此 User 信息也包含在查询中。

【讨论】:

  • 这在两个方面都不正确。 1)您所指的“其他”命名空间是System.Data.Entity.DynamicProxies,这是 EF 生成的动态代理的来源。但是,这些代理类继承自它们所代理的实体,因此它们可以互换使用。 2) 你没有使用Include。 OP 在初始查询中包含相关用户可能会更高效,但延迟加载(即不使用 Include)是一个完全有效的选择。
  • 1) 部分类必须与创建的类具有相同的命名空间。 2) 使用延迟加载,如果查询尚未执行,它将加载属性。在 FirstOrDefault 之后,一切都在内存中完成,因此您确实需要 Include
  • 对不起,但同样,你在这两个方面都错了。部分类可以分布在多个命名空间中。只要引用了每个命名空间,编译器就会将它们全部收集起来。在第二点上,访问该属性将发出另一个查询。这就是延迟加载的工作原理,这也是 EF 首先创建代理类 8n 的全部原因:因此它可以覆盖该属性以添加此功能。您不必先包含。
  • 1) 你能提供一些关于部分类在差异程序集中的证据吗?我经常使用 EF,需要使命名空间相同。阅读this。 2) 如果您在执行查询后访问该属性,则 EF 将不会发出另一个查询。唯一一次这样做是如果你有一个IQueryable 并且你继续执行它。 FirstOrDefault 不返回 IQueryable 所以没有 EF 不会发送另一个查询。之后你就在内存中工作了。
猜你喜欢
  • 2019-06-01
  • 2021-10-01
  • 2011-02-14
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多