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关系正确地绑定它?

EF代码优先的关系问题

如果你重写了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; }
}