@DarkByte2015

Как правильно описать структуру БД?

Я делаю чат и мне понадобилась БД для списка пользователей. Там будут в частности администраторы и баны. Я описал это так:
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 enum UserRole { User, Admin, SuperAdmin };

public class RoleInfo
{
	public long Id { get; set; }

	[Required]
	public RoleInfo Role { get; set; }
}

public class BanInfo
{
	public long Id { get; set; }

	[Required]
	public DateTime EndOfBan { get; set; }

	[MaxLength(64)]
	public string Reason { get; set; }
}

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; }
}

Но я запутался с атрибутами из DataAnnotations. Читаю вот эту статью. Как мне указать ForeignKey? Там как то оно не понятно описано... Чем атрибут Key отличается от ForeignKey? Где какой использовать в моем случае?

P.S. Вообще я и в структуре БД не уверен... Надо ли так сильно разносить это в разные таблицы? У меня было все в одной таблице, но мне посоветовали разнести. Как реально делают в таких случаях?

Еще раз перечитал вариант рассмотренный в статье, кое что начало проясняться. Если не ошибаюсь должно быть вот так:
public class BanInfo
{
	public long? UserId { get; set; }

	[ForeignKey(nameof(UserId))]
	public UserInfo User { get; set; }

	[Required]
	public DateTime EndOfBan { get; set; }

	[MaxLength(64)]
	public string Reason { get; set; }
}

public class RoleInfo
{
	public long? UserId { get; set; }

	[ForeignKey(nameof(UserId))]
	public UserInfo User { get; set; }

	[Required]
	public RoleInfo Role { get; set; }
}

Но так выбивает вот такие ошибки:

One or more validation errors were detected during model generation:

dbtest.Database.BanInfo: : EntityType 'BanInfo' has no key defined. Define the key for this EntityType.
dbtest.Database.RoleInfo: : EntityType 'RoleInfo' has no key defined. Define the key for this EntityType.
Bans: EntityType: EntitySet 'Bans' is based on type 'BanInfo' that has no keys defined.
Roles: EntityType: EntitySet 'Roles' is based on type 'RoleInfo' that has no keys defined.

А все разобрался. Надо было просто ключи в них тоже добавить.
  • Вопрос задан
  • 1213 просмотров
Пригласить эксперта
Ответы на вопрос 1
AndyKorg
@AndyKorg
Кнопконажиматель и припоерасплавлятель
А попробуйте нормализовать структуру. Немного о нормализации можно почитать тут Там кстати и о проектировании БД есть.
Ответ написан
Ваш ответ на вопрос

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

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