c# - 多对多:无法确定导航属性所代表的关系
问题描述
我正在尝试使用代码优先工作流添加迁移,但似乎 EF 核心无法识别“TeamMember”和“Step”类之间的多对多关系。
我的“步”课:
public class Step {
public int Id { get; set; }
public int ProjectId { get; set; }
public Project Project { get; set; }
[Required]
[StringLength(30, MinimumLength = 3, ErrorMessage = "The step name must have between 3 and 30 characters!")]
public string Name { get; set; }
[Required]
[StringLength(500, MinimumLength = 10, ErrorMessage = "The step description must have between 10 and 500 characters!")]
public string Description { get; set; }
public ICollection<TeamMember> TeamMembers{ get; set; }
public Step() {
}
}
我的“团队成员”课程:
public class TeamMember {
public int Id { get; set; }
public int UserId{ get; set; }
public User User{ get; set; }
public string Role { get; set; }
public int TeamId { get; set; }
public Team Team{ get; set; }
public ICollection<Step> Steps{ get; set; }
public TeamMember() {
}
}
我的上下文类:
public class ProjectContext : IdentityDbContext<User> {
public ProjectContext(DbContextOptions<ProjectContext> options)
: base(options) {
}
public DbSet<User> User { get; set; }
public DbSet<Project> Projects { get; set; }
public DbSet<Team> Teams { get; set; }
public DbSet<Step> Steps { get; set; }
public DbSet<TeamMember> TeamMembers{ get; set; }
protected override void OnModelCreating(ModelBuilder builder) {
builder.Entity<User>().HasKey(m => m.Id);
builder.Entity<Project>().HasKey(m => m.Id);
builder.Entity<Team>().HasKey(m => m.Id);
builder.Entity<Step>().HasKey(m => m.Id);
builder.Entity<TeamMember>().HasKey(m => m.Id);
base.OnModelCreating(builder);
}
}
错误字符串:无法确定“ICollection”类型的导航属性“Step.TeamMembers”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。
如您所见,我ICollection
在每个课程中都有一个,但我无法找出错误。
解决方案
默认情况下,EF Core 不支持多对多关系。
您必须创建一个连接表才能实现关系:
您可以像这样轻松配置它:
步:
public class Step {
public ICollection<TeamMemberStep> TeamMemberStep { get; set; }
}
队员:
public class TeamMember {
public ICollection<TeamMemberStep> TeamMemberStep { get; set; }
}
连接表:
public class TeamMemberStep
{
public string TeamMemberId { get; set; }
public virtual TeamMember TeamMember { get; set; }
public int StepId { get; set; }
public virtual Step Step { get; set; }
}
数据库上下文:
modelBuilder.Entity<TeamMemberStep>()
.HasKey(aup => new { aup.TeamMemberId, aup.StepId });
public DbSet<TeamMemberStep> TeamMemberSteps { get; set; }
现在您查询该TeamMemberStep
表以从任一方获取您的数据。
推荐阅读
- python - 如何在字符串中添加双引号使其看起来像 json?
- oracle - Oracle 日期时间函数问题
- algorithm - 证明递归行列式的复杂性
- javascript - 无法从 redux 状态渲染 props 的值
- php - 如何解决在 laravel 中调用 bool 上的成员函数部门()
- node.js - 如何使用 find 方法 express js 获取文档数量?
- sql - SQL:防止无效数据插入表的触发器
- mongodb - 如何仅匹配包含另一个数组的条件适用于数组中的所有文档的文档?
- javascript - TinyMCE 表:如何隐藏高级属性?
- ruby-on-rails - Rails Webpacker 在生产环境中编译错误