我尝试使用Entity Framework 6.1.3 Code First为运动应用程序创建数据库。当我尝试使数据库抛出异常。
属性' HomeTeamId'上的ForeignKeyAttribute在类型'匹配'无效。导航属性' TeamId'没有找到依赖类型'匹配'。 Name值应该是有效的导航属性名称。
我的团队课
public class Team
{
private ICollection<Match> matches;
public Team()
{
this.matches = new HashSet<Match>();
}
public int Id { get; set; }
[Required]
[MinLength(5)]
[MaxLength(40)]
public string Name { get; set; }
public virtual ICollection<Match> Matches
{
get { return this.matches; }
set { this.matches = value; }
}
}
我的匹配课程
public class Match
{
public int Id { get; set; }
[Column(Order = 1)]
[ForeignKey("TeamId")]
public int HomeTeamId { get; set; }
public virtual Team HomeTeam { get; set; }
[Required]
[Range(0, 255)]
public byte HomeTeamScore { get; set; }
[Column(Order = 1)]
[ForeignKey("TeamId")]
public int AwayTeamId { get; set; }
public virtual Team AwayTeam { get; set; }
[Required]
[Range(0, 255)]
public byte AwayTeamScore { get; set; }
}
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
你有两个外键......
AwayTeamId
HomeTeamId
他们都引用
TeamId
EntityFramework应该能够根据您拥有的内容找出它自己的关系,因此请尝试删除ForeignKey
属性并尝试更新。
阅读ForeignKeyAttribute
/// <summary>
/// Denotes a property used as a foreign key in a relationship.
/// The annotation may be placed on the foreign key property and specify the associated navigation property name,
/// or placed on a navigation property and specify the associated foreign key name.
/// </summary>
所以...你的外键属性应该像这样设置......
[ForeignKey("AwayTeam")]
[ForeignKey("HomeTeam")]
我在本地复制了您的解决方案,删除了外键属性和所有其他相关属性,包括ID本身解决了问题。
public virtual Arena Arena { get; set; }
public virtual Team HomeTeam { get; set; }
[Required]
[Range(0, 255)]
public byte HomeTeamScore { get; set; }
public virtual Team AwayTeam { get; set; }
[Required]
[Range(0, 255)]
public byte AwayTeamScore { get; set; }
如您所见,没有AwayTeamId,没有HomeTeamId
这就是实体框架在后端生成的内容......你仍然拥有一对多的关系,测试它,如果你有问题请告诉我