ASP.NET MVC 5模型导航属性错误

时间:2016-10-14 15:24:25

标签: asp.net-mvc asp.net-mvc-5

所以我有两个模型,我正在努力工作,

public class Contract
{
   [Key]
   public int Id { get; set; }
   public string AwardId { get; set; }

   [ForeignKey("Id")]
   public virtual ICollection<ContractHistory> contractHistory { get; set; }
}

public class ContractHistory
{
   [Key]
   public int Id { get; set; }
   public string AwardId { get; set; }

   [ForeignKey("Id")]
   public virtual Contract contract { get; set; }
}

有很多ContractHistory与一份合约有关。

我继续使用该设置获得运行时InvalidCastException,但是当我删除ContractHistory中的导航属性,并将Contract导航属性修改为:

public virtual ContractHistory contractHistory { get; set; }

它正确执行连接而没有任何错误。

我只有一年的.NET使用经验,并且不知道问题是什么。理想情况下,我想从Contract转到ContractHistory列表,从ContractHistory转到一个合约。最糟糕的情况是我创建独立的数据存储库方法来明确地提取这些记录,但更愿意找出这个问题的解决方案以供将来参考。

欢迎任何建议或跟进问题,并提前致谢!

2 个答案:

答案 0 :(得分:1)

据我所知,您希望实现一对多关系,如果是这样,您必须从合同类中的合同历史记录集合中删除foreginkey属性,并在合同历史记录类中将contractId属性作为foreignkey添加为下面:

>>> df
    a   b   c
0  10  20  30
1  11  21  31
2  12  22  32

>>> df['b'][df[df['a'] == 11].index.tolist()].tolist()
[21]

答案 1 :(得分:1)

您的ContractHistory课程没有外键属性。

此外,您不需要ForeignKeyAttribute覆盖public virtual ICollection<ContractHistory> contractHistory { get; set; },因为您应该引用ContractHistory类中的外键。

ForeignKeyAttribute构造函数将字符串作为参数。

MSDN

  

参数

     

名称

     

输入:System.String

     

如果将ForeigKey属性添加到外键属性,则应指定关联导航属性的名称。如果将ForeigKey属性添加到导航属性,则应指定关联外键的名称。如果导航属性具有多个外键,请使用逗号分隔外键名称列表。

所以在你的情况下:

[ForeignKey("Id")]
public virtual Contract contract { get; set; }

您将ForeignKeyAttribute放在导航属性contract上。所以基本上你的类会搜索一个名为Id的属性并将其识别为外键。但是在您的课程中,Id具有Key属性,这意味着您将其声明为主键。

因此,为了解决这个问题,您需要将另一个属性添加到将成为外键的ContractHistory类中。然后将ForeignKeyAttribute中的字符串更改为该属性的名称。

示例:

public class ContractHistory
{
    [Key]
    public int Id { get; set; }
    public string AwardId { get; set; }
    public int contractID {get;set;}

    [ForeignKey("contractID")]
    public virtual Contract contract { get; set; }
}

希望这有帮助!