首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EF Core 5直接和Indirec多对多配置

使用EF Core 5直接和Indirec多对多配置
EN

Stack Overflow用户
提问于 2021-04-02 19:19:56
回答 1查看 137关注 0票数 0

我有以下实体

代码语言:javascript
复制
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映射:

代码语言:javascript
复制
        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);

和用户映射

代码语言:javascript
复制
        builder
            .HasMany(nav => nav.Courses)
            .WithMany(nav => nav.Users);

在尝试创建新的迁移时,我不太清楚为什么要这样做。

不能将表'UserCourse‘用于实体类型'UserCourse’,因为它用于实体类型'UserCourse(Dictionary)‘和其他可能的实体类型,但是没有链接关系。在主键属性上向“UserCourse”添加外键,并指向映射到“UserCourse”的另一个实体上的主键。

我理解错误是什么,但不确定如何强制UserCourse映射使用生成的连接表或反之亦然。

另外,我需要OData的direcat映射,以及使用join实体在DbSet<UserCourse>上执行操作的间接映射

EN

回答 1

Stack Overflow用户

发布于 2021-04-02 20:37:06

public virtual ICollection<User> Users{ get; set; }Course实体中和public virtual ICollection<Course> Courses { get; set; }Users实体中是冗余的。实体应该更像这样

代码语言:javascript
复制
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方法应该有以下代码

代码语言:javascript
复制
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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66924200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档