@DarkByte2015

Почему не сохраняется свойство?

Пишу авторизацию для чата с помощью 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;
}
  • Вопрос задан
  • 300 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы