EF代码中的关系问题 - 首先

时间:2013-04-21 09:50:52

标签: c# .net entity-framework

我有两张桌子,我想加入游戏和细节。游戏有一个细节

问题是我无法正确绑定表格。我得到的错误是

“实体类型'游戏'和'详细信息'不能共享表'详细信息',因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,它们之间具有匹配的主键。”< / p>

这是我的实施

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

3 个答案:

答案 0 :(得分:0)

您不应使用Map来配置一对一的关系。请改用Fluent API的关系方法。

查看http://msdn.microsoft.com/en-us/data/jj591620.aspx#RequiredToRequired

答案 1 :(得分:0)

如果覆盖OnModelCreating,则不应具有属性属性。

答案 2 :(得分:0)

好的,您也可以使用数据注释属性来执行此操作:

  • 首先,您不需要在两个实体中指定外键,只需在依赖实体中指定它即可。
  • 同样在Principal类中,即使您想要引用它,也不需要存储依赖实体的id。
  • 此外,因为它是1-1关系,所以你不需要这一行: public virtual ICollection 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; }
}