繁体   English   中英

实体框架多对多,读取不起作用

[英]Entity framework many to many, reading does not work

我在用户和他们的角色之间创建了多对多的关系。 每当我将角色添加到用户时,如果之前没有插入用户和角色(相同的键),它就可以正常工作,但我无法读取中间表。 如果我搜索用户或角色的连接,结果始终为 0。

我怎样才能解决这个问题?

public User()
{
  Roles = new HashSet<Role>();
}

public virtual ICollection<Role> Roles { get; set; }
public Role()
{            
  Users = new HashSet<User>();
}

public virtual ICollection<User> Users { get; set; }

SomeDbContext :

 public virtual DbSet<User> Users { get; set; } = null!;
 public virtual DbSet<Role> Roles { get; set; } = null!;

modelBuilder.Entity<User>(entity =>
{
entity.ToTable("users");

entity.HasIndex(e => e.id, "users$UNIQ_34634663476347")
                    .IsUnique();
entity.HasIndex(e => new { e.CrmId, e.CrmResident }, "users$crm_unique")
                    .IsUnique();
entity.Property(e => e.Id).HasColumnName("id");

entity.Property(e => e.CrmId)
                    .HasColumnType("numeric(20, 0)")
                    .HasColumnName("crm_id");

entity.HasMany(d => d.Roles)
    .WithMany(p => p.Users)
    .UsingEntity<Dictionary<string, object>>("UserRole",l => l.HasOne<Role>() 
 
 .WithMany().HasForeignKey("RoleId").OnDelete(DeleteBehavior.ClientSetNull).HasConstraintName("user_role$FK_2DE8C6A3D60322AC"),r => r.HasOne<User>()
.WithMany().HasForeignKey("UserId").HasConstraintName("user_role$FK_2DE8C6A3A76ED395"),
          j =>
          {
            j.HasKey("UserId", "RoleId").HasName("PK_user_role_user_id");

            j.ToTable("user_role");

            j.HasIndex(new[] { "UserId" }, "IDX_2DE8C6A3A76ED395");

            j.HasIndex(new[] { "RoleId" }, "IDX_2DE8C6A3D60322AC");

            j.IndexerProperty<int>("UserId").HasColumnName("user_id");

            j.IndexerProperty<int>("RoleId").HasColumnName("role_id");
          });
}

我正在尝试使用以下方式访问数据:

user = SomeDbContext.Users.FirstOrDefault(a =>  a.CrmId == userData.CrmId);
user.Roles.Count(); // always 0

var MatchingRole = SomeDbContext.Roles.FirstOrDefault(role => role.Role1 == "someRole1");
MatchingRole.Users.Count() // always 0

// Adding 

MatchingRole.Users.Add(user); // or
//user.Roles.Add(MatchingRole);

SomeDbContext.SaveChanges();

像这样的东西:

var user = SomeDbContext.Users.Include(x => x.Roles).FirstOrDefault(x =>  x.CrmId == userData.CrmId);

var rolesCount = user.Roles.Count();

var matchingRole = SomeDbContext.Roles.Include(x => x.Users).FirstOrDefault(role => role.Role1 == "someRole1");

var usersCount = matchingRole.Users.Count()


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM