EF代码优先的关系问题
本文关键字:关系 问题 代码 EF | 更新日期: 2023-09-27 18:10:07
我有两个表,我想加入游戏和细节。游戏有一个Detail
问题是我不能正确地绑定表。我得到的错误是
"实体类型'Game'和'Details'不能共享表'Details',因为它们不在相同的类型层次结构中,或者它们之间没有有效的一对一外键关系和匹配的主键。"
这是我的实现
public class Game
{
[Key]
[ForeignKey("GameDetails")]
public int GameId { get; set; }
public string GameName { get; set; }
//Navigation prop
public virtual Details GameDetails { get; set; }
public virtual ICollection<Details> DetailsId { get; set; }
}
public class Details
{
[Key]
public int DetailsId { get; set; }
public int GameId { get; set; }
public int RatingId { get; set; }
public int Grade { get; set; }
//Navigation prop
[ForeignKey("DetailsId")]
public virtual Game GameDetails { get; set; }
public virtual RatingCompany RatingCompany { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Game>().HasKey(f => f.GameId);
modelBuilder.Entity<Game>()
.Map(m =>
{
m.Properties(b => new {b.GameId});
m.ToTable("Details");
});
}
如何用1-1关系正确地绑定它?
如果你重写了OnModelCreating,你就不应该有属性
您不应该使用Map
来配置一对一关系。请使用fluent API的关系方法。
请看http://msdn.microsoft.com/en-us/data/jj591620.aspx#RequiredToRequired
好的,您也可以使用数据注释属性:
- 首先,你不需要在两个实体中指定外键,你只需要在从属实体中指定它。
- 同样,在Principal类中,即使你想要引用它,也不需要存储依赖实体的id。
- 也因为它是1-1关系,你不需要这行:public virtual collection DetailsId {get;设置;}
- 从你所说的游戏是主要实体,细节是从属实体。
代码如下所示:
public class Game
{
[Key]
public int GameId { get; set; }
public string GameName { get; set; }
//Navigation prop
public virtual Details GameDetails { get; set; }
}
public class Details
{
[Key]
[ForeignKey("Game")]
public int GameId { get; set; }
public int RatingId { get; set; }
public int Grade { get; set; }
//Navigation prop
public virtual Game Game{ get; set; }
public virtual RatingCompany RatingCompany { get; set; }
}