所以我有两个模型,我正在努力工作,
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转到一个合约。最糟糕的情况是我创建独立的数据存储库方法来明确地提取这些记录,但更愿意找出这个问题的解决方案以供将来参考。
欢迎任何建议或跟进问题,并提前致谢!
答案 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; }
}
希望这有帮助!