0

我正在定义一个多对多关系,如下所示:

    modelBuilder.Entity<GameSessionEntry>().
         HasMany(c => c.Users).
         WithMany(p => p.GameSessionEntries).
         Map(
          m =>
          {
              m.MapLeftKey("SessionId");
              m.MapRightKey("UserId");
              m.ToTable("UserSessions");
          });

但是,我不断得到:

由于无法确定主键列,因此无法创建具有列“UserId”的表“UserSessions”上的外键。使用 AddForeignKey fluent API 来完全指定外键。

我对数据库工作和一般的 EntityFramework 不熟悉 - 它要求我做什么?

4

3 回答 3

1

这就是我通常创建多对多表的方式(注意这不需要流畅的 api 配置)

public class User
{
    public int Id { get; set; }
    public virtual ICollection<UserSession> UserSessions { get; set; }
}

public class Session
{
    public int Id { get; set; }
    public virtual ICollection<UserSession> UserSessions { get; set; }
}

public class UserSession
{
    [Key]
    [Column(Order = 1)]
    public int UserId { get; set; }

    [Key]
    [Column(Order = 2)]
    public int SessionId{ get; set; }

    public virtual User User { get; set; }
    public virtual Session Session { get; set; }
}
于 2013-07-25T08:33:56.843 回答
1

这是反复出现的左右混淆,请参阅Slauma的解释。所以你只需要转一下键名:

  m.MapLeftKey("UserId");      // Property in the HasMany call
  m.MapRightKey("SessionId");  // Property in the WithMany call
于 2013-07-25T07:50:52.403 回答
0

与其摆弄多对多关系,不如将其重写为弱实体集。

例如,如果您有这种关系:

在此处输入图像描述

您可以将其重新设计为弱实体集:

在此处输入图像描述

通过这样做,您摆脱了多对多关系,并且不必将相同的数据存储在多个表中。

更多信息:http : //fileadmin.cs.lth.se/cs/Education/EDA216/lectures/dbtoh4.pdf 从幻灯片 87/360 开始阅读关于“关系数据模型”的讲座幻灯片。

于 2013-07-25T07:59:23.407 回答