当前位置: 首页 > 知识库问答 >
问题:

基于外键EF的主键

尉迟明贤
2023-03-14

一开始我尝试过,如下所示,但仍然没有结果:

  • 将两个外键定义为实体框架中的主键
  • 实体框架两个外键作为主键

这是我的实体:

public class Passage
{
        [Key, ForeignKey("FromID")]
        public Localization From { get; set; }

        public int ToID { get; set; }

        [Key, ForeignKey("ToID")]
        public Localization To { get; set; }

        [Required]
        public string HourForm { get; set; }

        [Required]
        public string HourTo { get; set; }

        [Required]
        public int Seats { get; set; }

        [Required]
        public char Weekend { get; set; }

        public int? AdditinalTime { get; set; }

        public int FromID { get; set; }
}

我正在尝试基于两个外键创建主键。有一个错误

EntityType“Passage”未定义键。定义此EntityType的键。

我做错了什么?

共有2个答案

卫昊东
2023-03-14

正如其中一个引用的链接所述,您需要使用Column属性来指定复合键的顺序:

public class Passage
{
    [Key,Column(Order=0), ForeignKey("From")]
    public int FromId { get; set; }

    [Key,Column(Order=1), ForeignKey("To")]
    public int ToId { get; set; }
    //...
}

我现在注意到您正在导航属性上使用这些属性,正如@PaulAbbott在他的回答中所说,主键必须使用标量属性定义,在本例中是FK属性。

云啸
2023-03-14

直接从第一个链接引用:

“主键必须始终由实体类中的标量属性定义。不能仅通过导航属性引用PKs。”

因此,需要将键属性放在标量值上,而不是导航属性上。

public class Passage
{
    [Key, ForeignKey("From"), Column(Order = 0)]
    public int FromID { get; set; }

    public Localization From { get; set; }

    [Key, ForeignKey("To"), Column(Order = 1)]
    public int ToID { get; set; }

    public Localization To { get; set; }
}
 类似资料:
  • 我有一个包含数据的表,其中一个行需要存在于另一个表中。所以,我想要一个外键来保持引用的完整性。 但是,正如您所看到的,我的外键所指向的表,列不是PK。有没有一种方法来创建这个外键,或者可能有一种更好的方法来维护这个引用完整性?

  • 我正在使用jOOQ为我的数据库表生成POJO。这很有效。 我有一个带有主键()和唯一键()的表。更新记录时,jOOQ使用主键。 我想通过使用唯一键而不是主键来更新记录。 https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java 本质上,我想用另一个键(第二个参

  • 假设您有一个表,如下所示: 可以看到列是表的主键和外键。是的,MySQL成功生成了这个表。 问题很简单,我将如何在JPA实体中映射这一点?我是否应该有映射到列的1个id和连接列的另一个字段?欢迎提出建议。

  • 为使用 Dao 接口的 fetch(Class<?>, long) 以及 fetch(Class<?>, String),需要为一个 POJO 指明它的主键。 主键可以是整数型的,也可以是字符型的。同时它也可以支持复合主键。 整数型主键 注解 @Id 声明在字段上 字符型主键 注解 @Name 声明在字段上 复合主键 注解 @PK 声明在类上 注意: 对于一个 POJO,你可以同时为其声明 @Id

  • 本文向大家介绍主键、外键和索引的区别?相关面试题,主要包含被问及主键、外键和索引的区别?时的应答技巧和注意事项,需要的朋友参考一下 主键、外键和索引的区别 定义: 主键–唯一标识一条记录,不能有重复的,不允许为空 外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引–该字段没有重复值,但可以有一个空值 作用: 主键–用来保证数据完整性 外键–用来和其他表建立联系用的 索引–是提高查

  • 问题内容: 关于如何使用MySQL的外键构造有什么好的解释? 我不太了解MySQL文档本身。到目前为止,我一直在通过联接和编程代码处理诸如外键之类的事情。 问题的第二部分,使用MySQL的内置外键是否有任何改进? 问题答案: 只要确保您的数据是一致的。 他们没有从效率上改善查询,只是使一些错误的查询失败。 如果您有这样的关系: ,那么你就不能删除,如果它有一些的。 如果你提供的定义,引用行会自动与