Я делаю чат и мне понадобилась БД для списка пользователей. Там будут в частности администраторы и баны. Я описал это так:
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.
А все разобрался. Надо было просто ключи в них тоже добавить.