【问题标题】:EntityFramework - Composite keys and foreign keyEntityFramework - 复合键和外键
【发布时间】:2018-04-04 14:59:26
【问题描述】:

我正在开发一个项目,我正在使用实体框架和代码优先方法。我的第一个模型 Player 有两个字符串作为它的 ids(我没有选择那个,我知道这是一个不好的方法):

public class Player()
{

    [Key, Column(Order=0)]
    public string Name { get; set;}

    [Key, Column(Order=1)]
    public string TeamId { get; set;}

    public Stat PlayerStat { get; set;}
}

类统计:

public class Stat()
{

    [Key]
    public int Id { get; set;}

    // This property should set the name id of the player
    public string Name { get; set;}

    // This property should set the teamId of the player
    public string TeamId{ get; set;}

    [Required]
    public Player Player { get; set;}
}

玩家类与stat类是一对一的关系,其中Stat类对于玩家类是可选的,而玩家类对于stat类是必需的。

我的问题是,当我使用 Entity Framework 创建新迁移并更新数据库时,它会为 Stat 表创建 5 列。

  • 身份证
  • 姓名
  • 团队 ID
  • 玩家姓名
  • Player_TeamId

类 stat 中的属性 Name 和 TeamId 应该只用于设置外键的值,而不应该在表中创建列。有没有办法将属性名称映射到生成的列 "Player_Name" 和 TeamId 到 "Player_TeamId" ?

【问题讨论】:

  • 您需要手动为每个表创建外键。除非您有一个 ID 列来保存该引用,否则这些对象引用将无法工作。 EF 正在尝试为您创建它,因为您没有指定一个。你有一个 team_id 但你没有告诉 EF 它是你的外键。如果您使用带有快速拖放功能的 EF 设计器,您可以非常轻松地做到这一点。您的统计表中没有指向父玩家的 player_id
  • 玩家名字作为主键的一部分 - 这很“残忍”:)
  • 确实是哈哈

标签: c# entity-framework foreign-keys composite-primary-key


【解决方案1】:

您需要在 Stat 类中引用您的外键:

[ForeignKey("Player")]
public string Name { get; set;}

[ForeignKey("Player")]
public string TeamId { get; set;}

【讨论】:

  • 当我尝试像这样将属性添加到属性中时:[ForeignKey("Player"), Column(Order = 1)],我收到此错误:因为从属角色属性不是关键属性,所以多重性的上限从属角色的名称必须为“*”。
  • 好的,我想我明白了,我删除了类 stat 中的 id 属性,并将 key 属性添加到我的两个外键中。谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多