SQL запрос в C# возвращает список одних и тех же данных

Рейтинг: 0Ответов: 1Опубликовано: 23.07.2023

Таблица Comments связана внешними ключами с Videos и Users и имеет свой Id, таким образом пользователь может оставлять несколько комментариев под видео. Но при получении данных в C# возвращается список из одинаковых значений там, где совпадают внешние ключи. По всей видимости результаты сравниваются по внешним связям, а не по первичному ключу, при том, что в MS SQL тот же запрос работает как и должен. В чём проблема, как это фиксить?

Код класса Comment :

public class Comment
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string VideoUrl { get; set; }
    public Video Video { get; set; }

    public int UserId { get; set; }
    public User User { get; set; }

    public DateTime Date { get; set; } = DateTime.Now;
    public string Message { get; set; }
} 

Связь в DbContext:

modelBuilder.Entity<Comment>().HasKey(v => new { v.UserId, v.VideoUrl });
modelBuilder.Entity<Comment>().HasOne(v => v.User).WithMany(u => u.Comments).HasForeignKey(v => v.UserId);
modelBuilder.Entity<Comment>().HasOne(v => v.Video).WithMany(v => v.Comments).HasForeignKey(v => v.VideoUrl);

Схема в MS SQL

Схема

Результат выполнения запроса

Результаты

Ответы

▲ 0

Проблема решилась добавлением AsNoTracking(). По всей видимости Entity Framework каким-то образом индексирует данные по внешним ключам, игнорируя первичный. Отключая отслеживание индексации нет. Также для изменения данных нужно отправлять SQL запросы напрямую через ExecuteSqlAsync()