复合主键和外键 Code First

Posted

技术标签:

【中文标题】复合主键和外键 Code First【英文标题】:Composite primary keys and foreign keys Code First 【发布时间】:2016-07-05 18:13:55 【问题描述】:

我正在尝试创建 2 个实体,用户和用户评论,其中用户评论有一个复合主键,它是用户的 id,被评论的人和谁做了它,这个复合主键也是用户表中主键的外键,但是 EF 正在创建一个额外的列,我看不到其中的意义,当我将用户评论对象保存到数据库时,该列没有被填充,它总是空。

这导致当我尝试使用评论检索用户时,评论集合始终为空,除非 User_SubjectId 列包含用户的 ID。

我的查询是这样的

 return _context.Users
                .Include(u => u.Reviews)
                .Where(u => u.SubjectId.Equals(subjectId));

评论集合始终为空

用户评论实体

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace API.Data.Entities

    public class UserReview
    
        [Key, Column(Order = 0), ForeignKey("Reviewer")]
        public string ReviewerId  get; set;  //The user that wrote the review

        [Key, Column(Order = 1), ForeignKey("ReviewedUser")]
        public string ReviewedUserId  get; set;  //The user who was reviewed

        [Required]
        [Range(1, 5)]
        public int Rating  get; set; 

        [Required]
        public DateTimeOffset DateCreated  get; set; 

        [Required]
        public virtual User Reviewer  get; set; 

        [Required]
        public virtual User ReviewedUser  get; set; 
    

User实体是这样的

public class User
    
        [Key]
        [Required]
        public string SubjectId  get; set; 

        public User()
                        
            Reviews = new List<UserReview>();
        

        public virtual ICollection<UserReview> Reviews  get; set;     
    

但是,当我添加迁移时,在我的 UserReviews 表中创建了另一列,如图所示,该列是 User_SubjectId

我不知道这是 EF 中的错误还是我的映射错误,无论如何有什么想法?

谢谢

【问题讨论】:

您的未知列是由 User.Reviews 属性创建的。您还没有映射其外键,因此 EF 将自动生成名称。 什么意思是没有映射?,检查我的UserReview实体,2个外键在那里 评论链接到哪一个外键? 哦,我明白你在说什么了,你知道怎么指定吗? 【参考方案1】:

您必须使用 ReverseProperty 注释。

public class UserReview

    [Key, Column(Order = 0), ForeignKey("Reviewer")]
    public string ReviewerId  get; set;  //The user that wrote the review

    [Key, Column(Order = 1), ForeignKey("ReviewedUser")]
    public string ReviewedUserId  get; set;  //The user who was reviewed

    [Required]
    [Range(1, 5)]
    public int Rating  get; set; 

    [Required]
    public DateTimeOffset DateCreated  get; set; 

    [Required]
    public virtual User Reviewer  get; set; 

    [Required)]
    public virtual User ReviewedUser  get; set; 


public class User

    [Key]
    [Required]
    public string SubjectId  get; set; 

    public User()
                    
        Reviews = new List<UserReview>();
    

    [InverseProperty("ReviewedUser")] // or Reviewer.
    public virtual ICollection<UserReview> Reviews  get; set;     

在我看来,这是使用流畅映射时更容易配置的东西。

【讨论】:

是的,我最终使用了流利的映射,但您的回答为我指明了正确的方向。

以上是关于复合主键和外键 Code First的主要内容,如果未能解决你的问题,请参考以下文章

具有主键和外键的事实表

主键和外键

在复合键和外键之间创建关系

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?