无法将类型为'System.Collections.Generic.List`1 [ModelA]'的对象转换为'ModelA'类型

时间:2013-01-29 19:30:07

标签: c# json data-binding asp.net-mvc-4 entity-framework-5

这个错误让我发疯。它曾经工作过。现在它没有。不确定是什么变化导致它,我不能回滚而不会丢失很多东西。

 Unable to cast object of type 'System.Collections.Generic.List`1[Literrater.Models.ranges]' 
 to type 'Literrater.Models.ranges'.

这是模特。

public class Comment
{
    [Key]
    public int CommentID { get; set; }
    public int ProjectDocID { get; set; }
    public int UserID { get; set; }
    public string text { get; set; }
    public string quote { get; set; }
    public DateTime DateCreated { get; set; }

    public virtual ICollection<CommentVote> CommentVote { get; set; }
    public virtual ICollection<CommentReply> CommentReply { get; set; }
    public virtual ICollection<CommentReport> CommentReport { get; set; }
    public ProjectDoc ProjectDoc { get; set; }
    public virtual User User { get; set; }
    public ICollection<ranges> ranges { get; set; }
}
public class ranges
{
    public int ID { get; set; }
    public string start { get; set; }
    public string end { get; set; }
    public string startOffset { get; set; }
    public string endOffset { get; set; }


}

引发错误的操作

    [HttpPost, ActionName("Create")]
    public ActionResult Create(Comment comment)
    {
        comment.DateCreated = DateTime.Now;
        comment.UserID = WebSecurity.CurrentUserId;
        db.Comments.Add(comment); //Error here
        db.SaveChanges();
        return Json(comment);

Json被张贴。

 {"text":"",
  "ranges":
       [{
            "start":"/p[1]",
            "startOffset":160,
            "end":"/p[1]",
            "endOffset":234
       }],
   "quote":"es. Hadn't they ever heard of potpourri? Each incessant beep, made by the",
   "UserID":"6",
   "ProjectDocID":"1"
 }

更新:旧工作数据库的屏幕截图 enter image description here enter image description here

3 个答案:

答案 0 :(得分:1)

一次更换一个文件几个小时后,我的DAL上下文文件似乎有这个流畅的API语句。

 modelBuilder.Entity<ranges>().HasRequired(p => p.Comment);

我不知道为什么我添加它,但是评论它会使错误消失。如果有人可以解释它会很好。

原来我做到了,所以我可以删除评论,现在不行。

答案 1 :(得分:1)

就我而言,事实证明我的xml源中有一对多的关系:

  <one-to-many name="physicalLocations"
           propertyDefinintion="Defines the physical location of the department"
           typeName="POCO.BO.Location"
           nullable="false"
           dbColumn="DepartmentId" />

但在生成的C#文件中仍然有一个外键关系值:

    /// <summary>
    /// Defines the physical location of the department
    /// </summary>
    public const string F_PHYSICALLOCATIONS = "PhysicalLocations";
    [ForeignKey("PhysicalLocations")]
    public string DepartmentId { get; set; }
    private Location _physicalLocations;
    public virtual Location PhysicalLocations { get { return _physicalLocations; } set { _physicalLocations = value; } }

所以它实际上是一对一而不是一对多。我这样修好了:

  <one-to-one name="physicalLocations"
           propertyDefinintion="Defines the physical location of the department"
           typeName="POCO.BO.Location"
           nullable="false"
           dbColumn="DepartmentId" />

答案 2 :(得分:1)

我有完全相同的错误,并且最终有相同的原因-EF对这种关系的性质缺乏一致的理解。

就我而言,我们使用的是基于注释的模型,并且数据库结构是独立管理的。我会无意间将模型设置错误...

数据库结构:

  • 我有一个父表和一个子表。一对多子女的父母。
  • 子表的父ID列为父级。
  • 子表没有人工PK。
  • 子表的自然PK为ParentId + Col1 + Col2。

错误的EF设置:

在父母中

    public ICollection<TriangleCell> Cells { get; set; }

在儿童中

    [Key]
    public int ParentId { get; set; }
    [ForeignKey(nameof(ParentId ))]
    public ParentTable Parent{ get; set; }

    public int Col1 { get; set; }
    public int Col2 { get; set; }
    public int ValueCol { get; set; }

我相信,因为只有ParentId被标记为Key,所以EF推断关系必须是一对一的,而且一切都出错了。

在模型类中标记其余的自然键可修复该错误。

良好的EF设置:

在父母中

    public ICollection<TriangleCell> Cells { get; set; }

在儿童中

    [Key, Column(Order = 0)]
    public int ParentId { get; set; }
    [ForeignKey(nameof(ParentId ))]
    public ParentTable Parent{ get; set; }

    [Key, Column(Order = 1)]
    public int Col1 { get; set; }
    [Key, Column(Order = 2)]
    public int Col2 { get; set; }

    public int ValueCol { get; set; }