【问题标题】:Entity Framework - Many to many?实体框架 - 多对多?
【发布时间】:2013-07-25 06:20:09
【问题描述】:

我将多对多关系定义如下:

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

但是,我不断得到:

表 'UserSessions' 上的外键和列 'UserId' 可以 未创建,因为无法创建主键列 决定。使用 AddForeignKey fluent API 完全指定 外键。

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

【问题讨论】:

  • 检查Usersessions表所引用的UserId列是否是Users表中的主键。
  • @PawanNogariya 我该怎么做?我没有明确指定任何内容。 “User”表中的 PK 就是“Id”。

标签: c# mysql database entity-framework


【解决方案1】:

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

  m.MapLeftKey("UserId");      // Property in the HasMany call
  m.MapRightKey("SessionId");  // Property in the WithMany call

【讨论】:

  • 我现在在我的官方...但是查看文档..应该可以解决它。嗬!谢谢!
【解决方案2】:

这就是我通常创建多对多表的方式(注意这不需要流畅的 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; }
}

【讨论】:

    【解决方案3】:

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

    如果你有这种关系:

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

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

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

    【讨论】:

    • EF 总是在数据库中创建一个弱实体,因为这是建模多对多关联的唯一方法。但是我们可以选择是否将它作为一个类包含在概念模型中。该选择取决于以下问题:关联是否具有自己的属性?我们要使用外键关联而不是独立关联吗?我们是否希望直接访问关联,例如删除它们而不必在所有者对象中加载导航属性?
    • 好的,很高兴知道。我刚刚发布了这个答案,因为 Vaughan Hilts 写道,他是数据库工作的新手,我认为了解良好的数据库设计是件好事(即使在这种情况下没有必要,但知道在后台发生了什么总是好的) .我不知道关于不能解决实际问题的答案的政策,但你知道的越多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2014-08-04
    • 2017-01-28
    • 2012-06-09
    相关资源
    最近更新 更多