Коллекция внешних ключей пуста - PullRequest
0 голосов
/ 18 мая 2019

Итак, я пытался получить что-то с ядром EF. Я делаю код в первую очередь, так как это лучше для меня (я предпочитаю также, потому что пользователям не требуется предоставлять базу данных). В любом случае, у меня будет большая база данных с множеством связей, поэтому я должен использовать внешние ключи.

Однако коллекция внешнего ключа всегда равна нулю, даже если в базе данных она связана. Я получил эти 2 модели:

Пользователь:

[Table("users")]
public class User
{
    [Key]
    [Column("id")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Column("name")]
    [StringLength(15, MinimumLength =2)]
    [Required]
    public string Name { get; set; }

    [Column("password")]
    [StringLength(100)]
    [Required]
    public string Password { get; set; }

    [Column("email")]
    [StringLength(30, MinimumLength =6)]
    [Required]
    public string Email { get; set; }

    public List<UserActivityPoints> Activitypoints { get; set; }
}

UserActivityPoints:

[Table("activitypoints")]
public class UserActivityPoints
{
    [Key]
    [Column("type")]
    public int Type { get; set; }

    [Column("amount")]
    public int Amount { get; set; }

    [Key]
    [Column("user_id")]
    public User User { get; set; }
}

Итак, одна вещь, которая уже была странной, заключается в том, что в базе данных столбец user_id становится UserId, однако он правильно связан с пользователями, как показано ниже:

Рисунок PHPMyAdmin, показывающий, что он правильно связан

В контексте моей базы данных у меня есть следующий код:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().ToTable("User");
    modelBuilder.Entity<UserActivityPoints>().ToTable("activitypoints");
}

Я запускаю следующий код:

var i = ProductionDbContext.GetInstance().Users.Find(1).Activitypoints;

Я получил запись, показанную на следующем рисунке:

Запись добавлена ​​в базу данных

Однако, когда я отлаживаю, i всегда равен нулю, даже если у пользователя 1 есть запись в таблице баллов активности. Я что-то делаю не так или я что-то забываю?

1 Ответ

0 голосов
/ 18 мая 2019

В UserActivityPoints у вас есть [Key] выше, чем Type и UserId - EFCore думает, что вы пытаетесь объединить эти два в ваш первичный ключ. Ваш UserActivityPoints должен выглядеть так:

[Table("activitypoints")]
public class UserActivityPoints
{
    [Key]
    [Column("type")]
    public int Type { get; set; }

    [Column("amount")]
    public int Amount { get; set; }

    [Key]
    [Column("user_id")]
    public int UserId { get; set; }

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

Я удалил ключ, дал вам столбец только для идентификатора и объект для пользователя. Теперь это должно работать правильно. Док: https://docs.microsoft.com/en-us/ef/core/modeling/keys

...