如何为 sqlite 数据库迁移的多对多联接表编写 C# MVC 模型 { 编辑 }.



我正在创建一个sqlite数据库来跟踪分配给团队的用户。这意味着多对多表关系。我需要帮助制作迁移模型。

users table: 
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public ICollection<Photo> Photos { get; set; }
public virtual ICollection<UserTeam> UserTeams { get; set; }
}
team table:
public class Team
{
public int Id { get; set; }
public string Name { get; set; } 
public User User { get; set; }
public int UserId { get; set; }
public virtual ICollection<UserTeam> UserTeams{ get; set; }
}
UserTeam Table:
public class UserTeam
{
public User User { get; set; }
public int UserId{ get; set; }
public Team Team{ get; set; }  
public int TeamId{ get; set; } //... I have this one for owner of the team
public string Title { get; set; }
}
DataContext:
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base (options) {}
public DbSet<Value> Values { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<Photo> Photos { get; set; }
public DbSet<Team> Teams { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserTeam>()
.HasKey(ut => new { ut.UserId, ut.TeamId });  
modelBuilder.Entity<UserTeam>()
.HasOne(ut => ut.User)
.WithMany(u => u.UserTeams)
.HasForeignKey(ut => ut.UserId);  
modelBuilder.Entity<UserTeam>()
.HasOne(ut => ut.Team)
.WithMany(t => t.UserTeams)
.HasForeignKey(ut => ut.TeamId);
}
}

从我读到的内容来看,声明我在团队类和用户类上的 ICollection 将强制创建联接表。但是,当我尝试迁移时,我收到以下消息:无法确定类型为"ICollection"的导航属性"User.Teams"表示的关系。手动配置关系,或使用"[NotMapped]"属性或使用"OnModelCreateing"中的"EntityTypeBuilder.Ignore"忽略此属性。

关于如何在 sqlite 中正确制作连接表的任何建议都会有所帮助

看起来您正在使用EF Core 2.x。有必要在模型中定义实体。这意味着您必须通过在OnModelCreating方法中重写关系来定义关系。

我会通过创建另一个表来保存用户和用户所属团队的引用,反之亦然,从而进一步规范化您的结构。我会称这个表为UserTeam(因为缺乏更好的命名(

所以我会有这样的东西:

public class User
{
//....omitted
public virtual ICollection<UserTeam> UserTeams { get; set; }
}
public class UserTeam
{      
public int UserId{ get; set; }
public User User { get; set; }
public int TeamId{ get; set; }
public Team Team{ get; set; }
}
public class Team
{
//.... omitted
public virtual ICollection<UserTeam> UserTeams{ get; set; }
}

需要配置用户团队表,以便 EFCore 可以成功映射它。这就是我们定义多对多关系的地方

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserTeam>()
.HasKey(ut => new { ut.UserId, ut.TeamId });  
modelBuilder.Entity<UserTeam>()
.HasOne(ut => ut.User)
.WithMany(u => u.UserTeams)
.HasForeignKey(ut => ut.UserId);  
modelBuilder.Entity<UserTeam>()
.HasOne(ut => ut.Team)
.WithMany(t => t.UserTeams)
.HasForeignKey(ut => ut.TeamId);
}

最新更新