我有以下实体
public class Course
{
public long Id { get; set; }
public virtual ICollection<User> Users{ get; set; }
public virtual ICollection<UserCourse> CourseUsers { get; set; }
}
public class User
{
public long Id { get; set; }
public virtual ICollection<Course> Courses { get; set; }
public virtual ICollection<UserCourse> UserCourses { get; set; }
}
public class UserCourse
{
public long UserId { get; set; }
public User User { get; set; }
public long CourseId { get; set; }
public Course Course { get; set; }
public bool IsRequired { get; set; }
}具有以下映射的
UserCourse映射:
builder
.HasOne(nav => nav.User)
.WithMany(self => self.UserCourses)
.HasForeignKey(fk => fk.UserId)
.OnDelete(DeleteBehavior.Cascade);
builder
.HasOne(nav => nav.Course)
.WithMany(self => self.CourseUsers)
.HasForeignKey(fk => fk.CourseId)
.OnDelete(DeleteBehavior.Cascade);和用户映射
builder
.HasMany(nav => nav.Courses)
.WithMany(nav => nav.Users);在尝试创建新的迁移时,我不太清楚为什么要这样做。
不能将表'UserCourse‘用于实体类型'UserCourse’,因为它用于实体类型'UserCourse(Dictionary)‘和其他可能的实体类型,但是没有链接关系。在主键属性上向“UserCourse”添加外键,并指向映射到“UserCourse”的另一个实体上的主键。
我理解错误是什么,但不确定如何强制UserCourse映射使用生成的连接表或反之亦然。
另外,我需要OData的direcat映射,以及使用join实体在DbSet<UserCourse>上执行操作的间接映射
发布于 2021-04-02 20:37:06
public virtual ICollection<User> Users{ get; set; }在Course实体中和public virtual ICollection<Course> Courses { get; set; }在Users实体中是冗余的。实体应该更像这样
public class Course
{
public long Id { get; set; }
public virtual ICollection<UserCourse> UserCourses { get; set; }
}
public class User
{
public long Id { get; set; }
public virtual ICollection<UserCourse> UserCourses { get; set; }
}
public class UserCourse
{
public long UserId { get; set; }
public User User { get; set; }
public long CourseId { get; set; }
public Course Course { get; set; }
}OnModelCreating方法应该有以下代码
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserCourse>()
.HasKey(uc => new { uc.UserId, uc.CourseId });
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.Course)
.WithMany(c => c.Users)
.HasForeignKey(uc => uc.CourseId);
modelBuilder.Entity<UserCourse>()
.HasOne(uc => uc.User)
.WithMany(c => c.Courses)
.HasForeignKey(uc => uc.UserId);
}如果使用EF核心5,则可以直接跳过联接表。它将由EF在幕后生成和处理。关于本主题的更多信息,https://www.thereformedprogrammer.net/updating-many-to-many-relationships-in-ef-core-5-and-above/
https://stackoverflow.com/questions/66924200
复制相似问题