复合主键和外键 Code First
Composite primary keys and foreign keys Code First
我正在尝试创建 2 个实体,用户和用户评论,其中用户评论有一个复合主键,它是用户的 id,被评论的人和做评论的人,这个复合主键是也是用户 table 中主键的外键,但是 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 table 中创建另一列,如图所示,该列是 User_SubjectId
我不知道这是 EF 中的错误还是我的映射有误,无论如何有什么想法吗?
谢谢
您必须使用反向属性注释。
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; }
}
在我看来,这是使用流畅映射时更容易配置的东西。
我正在尝试创建 2 个实体,用户和用户评论,其中用户评论有一个复合主键,它是用户的 id,被评论的人和做评论的人,这个复合主键是也是用户 table 中主键的外键,但是 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 table 中创建另一列,如图所示,该列是 User_SubjectId
我不知道这是 EF 中的错误还是我的映射有误,无论如何有什么想法吗?
谢谢
您必须使用反向属性注释。
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; }
}
在我看来,这是使用流畅映射时更容易配置的东西。