简体   繁体   English

一对多.WithOne null Fluent API EF Core 6(代码优先)

[英]One to many .WithOne null Fluent API EF Core 6 (code first)

I've configured one to many relation between entity User and Role in my DbContext.我在我的 DbContext 中配置了实体用户和角色之间的一对多关系。

When I'm creating user through POST I'm getting this response which is correct当我通过 POST 创建用户时,我得到的响应是正确的

{
  "userId": 3,
  "userName": "test",
  "passwordHash": "$2a$11$IGUiIWdyXuyHlVXGxBGrOu3fi3RqvlaE.ksn/9M9a3X5hIiXFb19e",
  "roleId": 1,
  "role": {
    "roleId": 1,
    "name": "admin",
    "users": []
  },
  "offers": [],
  "responses": []
}

but when I will fetch user from DB then the role is null. RoleId is fine because its set as FK.但是当我从数据库中获取用户时,角色是 null。RoleId 很好,因为它设置为 FK。

{
    "userId": 3,
    "userName": "test",
    "passwordHash": "$2a$11$IGUiIWdyXuyHlVXGxBGrOu3fi3RqvlaE.ksn/9M9a3X5hIiXFb19e",
    "roleId": 1,
    "role": null,
    "offers": [],
    "responses": []
  }
]

MyContext.cs MyContext.cs

 modelBuilder.Entity<User>(entity =>
        {
            entity.HasKey(q => q.UserId);
            entity.Property(q => q.UserId)
                .ValueGeneratedOnAdd();

            entity.Property(q => q.UserName)
                .IsRequired();

            entity.Property(q => q.PasswordHash)
                .IsRequired();

            entity.HasOne(u => u.Role)
                .WithMany(r => r.Users)
                .HasForeignKey(u => u.RoleId)
                .IsRequired()
                .OnDelete(DeleteBehavior.ClientSetNull);
        });
 modelBuilder.Entity<Role>(entity =>
        {
            entity.HasKey(q => q.RoleId);
            entity.Property(q => q.RoleId)
                .ValueGeneratedOnAdd();

            entity.Property(q => q.Name)
                .IsRequired();
            entity.HasIndex(q => q.Name)
                .IsUnique();
        });

User.cs用户.cs

public class User
{
    public User(){}

    public long UserId { get; set; }
    public string? UserName { get; set; }
    public string? PasswordHash { get; set; }

    public long RoleId { get; set; }
    public virtual Role Role { get; set; }
}

Role.cs角色.cs

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

    public long RoleId { get; set; }
    public string? Name { get; set; }

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

Method for creating a user创建用户的方法

public async Task<User> Create(string username, string password, string role)
    {
        EnsureNotNull(username, nameof(username));
        EnsureNotNull(password, nameof(password));
        EnsureNotNull(role, nameof(role));

        username = username.ToLower();

        if (_context.Users.Any(q => q.UserName == username))
            throw CreateException($"User {username} already exists.", null);

        var hash = _securityService.HashPassword(password);
        var userRole = await _roleService.GetRoleByName(role);
        var ret = new User {UserName = username, PasswordHash = hash, Role = userRole};

        _context.Users.Add(ret);
        await _context.SaveChangesAsync();

        return ret;
    }

Method for getting users获取用户的方法

public async Task<List<User>> GetUsers()
    {
        return await _context.Users.ToListAsync();
    }

I can just find instance via id I got from Db, but when I was working with database first EF Core, there was no problem like this.我可以通过从 Db 获得的 id 找到实例,但是当我首先使用数据库 EF Core 时,没有这样的问题。

Adding include worked添加包括工作

_context.Users.Include(u => u.Role).ToListAsync()

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

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