繁体   English   中英

复合主键和外键Code First

[英]Composite primary keys and foreign keys Code First

我正在尝试创建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; }
    }
}

用户实体是这样的

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中的错误还是我的映射错误,无论如何有什么想法?

谢谢

您必须使用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; }    
}

在我看来,这是使用流利的映射时更易于配置的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM