EF Core создает оператор с неверным именем таблицы - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь получить некоторые значения с Include и ThenInclude, но EF Core создает инструкцию с недопустимым именем таблицы.

Это мой DataContext:

public class BaseContext : BaseDbContext 
{
    protected BaseWebsiteContext(DbContextOptions dbContextOptions) : base(dbContextOptions)
    {
    }

    public DbSet<Image> Images { get; set; }
    public DbSet<Tag> Tags { get; set; }
    public DbSet<ImageTags> ImageTags { get; set; }
}

Это мои три модели данных:

public class Image : Entity.Entity
{
    public string Title { get; set; }
    public string Filepath { get; set; }
    public DateTime CreateDate { get; set; }

    public ICollection<ImageTags> ImageTags { get; set; } = new List<ImageTags>();
}

public class Tag : Entity.Entity
{
    public string Name { get; set; }
    public string Description { get; set; }

    public ICollection<ImageTags> ImageTags { get; set; } = new List<ImageTags>();
}

public class ImageTags
{
    public int ImageId { get; set; }
    public Image Image { get; set; }
    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

базовый класс Entity содержит свойство первичного ключа Id (int) В моем OnModelCreating я добавил, чтобы определить составной PK.

modelBuilder.Entity<ImageTags>().HasKey(x => new {x.ImageId, x.TagId});

Итак, в моем репозитории это мой запрос:

return await _dataContext.Images
            .Include(x => x.ImageTags)
                .ThenInclude(x => x.Tag)
            .Where(w => w.ImageTags.Any(x => x.TagId == tagId))
            .ToListAsync();

И вот что EF генерирует:

SELECT [x.ImageTags].[ImageId], [x.ImageTags].[TagId], [i.Tag].[Id], [i.Tag].[Description], [i.Tag].[Name]
FROM [ImageTags] AS [x.ImageTags]
INNER JOIN [Tags] AS [i.Tag] ON [x.ImageTags].[TagId] = [i.Tag].[Id]
INNER JOIN (
    SELECT [x1].[Id]
    FROM [Images] AS [x1]
    WHERE EXISTS (
        SELECT 1
        FROM [ImageTags] AS [x2]
        WHERE ([x2].[TagId] = @__tagId_0) AND ([x1].[Id] = [x2].[ImageId]))
) AS [t] ON [x.ImageTags].[ImageId] = [t].[Id]
ORDER BY [t].[Id]

, что неверно, потому что моя таблица называется Tag, а не Tags, поэтому, конечно, он выдает SqlException System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Tags'.

Есть идеи, что я сделал не так?

Редактировать: Не знаюхочу изменить имя таблицы.Если я добавляю миграцию, EF генерирует мою миграцию / sql-таблицу.Как может быть, что появляется исключение?

1 Ответ

5 голосов
/ 18 июня 2019

Ваш DbContext DbSet для Tag равен public DbSet<Tag> Tags { get; set; }. В EF / EF Core свойства DbContext DbSet отображаются в таблицу базы данных. Следовательно, он ищет имя таблицы Tags для Tag, поскольку DbSet для Tag равно Tags.

Вы можете решить это любым из следующих способов:

  1. public DbSet<Tag> Tag { get; set; }
  2. Переименование Tag таблицы в Tags
  3. modelBuilder.Entity<Tag>().ToTable("Tag");
...