Пишу авторизацию для чата с помощью Entity Framework. Все уже в общем то написано давно было, но когда стал пристально тестить обнаружил баг. Сущность пользователя выглядит так:
public class UserInfo
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required, MinLength(4), MaxLength(32)]
public string Username { get; set; }
[Required, MinLength(4), MaxLength(32)]
public string Password { get; set; }
public long? RoleId { get; set; }
[ForeignKey(nameof(RoleId))]
public RoleInfo Role { get; set; }
public long? BanId { get; set; }
[ForeignKey(nameof(BanId))]
public BanInfo Ban { get; set; }
}
Так вот при регистрации создается UserInfo и RoleInfo, Role присваивается, сущность добавляется в список контекста и вызывается SaveChanges. Но авторизация потом работает только пока не остановишь сервер. При перезапуске сервера (и соответственно подгрузке БД) у сущности пропадает Role. Хотя там в отладчике видно что указан RoleId, но сама сущность Role остается в null. Почему так происходит? ForeignKey указан...
По просьбам трудящихся... Весь код:
public class DbContainer : DbContext
{
public DbContainer() : base($"name={nameof(DbContainer)}") { }
public virtual DbSet<UserInfo> Users { get; set; }
public virtual DbSet<RoleInfo> Roles { get; set; }
public virtual DbSet<BanInfo> Bans { get; set; }
}
public class UserInfo
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required, MinLength(4), MaxLength(32)]
public string Username { get; set; }
[Required, MinLength(4), MaxLength(32)]
public string Password { get; set; }
public long? RoleId { get; set; }
[ForeignKey(nameof(RoleId))]
public RoleInfo Role { get; set; }
public long? BanId { get; set; }
[ForeignKey(nameof(BanId))]
public BanInfo Ban { get; set; }
}
public class BanInfo
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public DateTime EndOfBan { get; set; }
[MaxLength(64)]
public string Reason { get; set; }
}
[Flags]
public enum UserRole : byte
{
User = 1,
Admin = 2,
SuperAdmin = 4
};
public class RoleInfo
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public UserRole RoleValue { get; set; } = UserRole.User;
}