EF Core生成具有无效表名的语句

Mat*_*ger 0 c# sqlexception entity-framework-core

我正在尝试使用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; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的三个数据模型:

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; }
}
Run Code Online (Sandbox Code Playgroud)

该基类Entity包含主键的属性Id (int) 在我中OnModelCreating,我添加了定义复合PK的方法。

modelBuilder.Entity<ImageTags>().HasKey(x => new {x.ImageId, x.TagId});
Run Code Online (Sandbox Code Playgroud)

因此,在我的存储库中,这是我的查询:

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

这就是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]
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为我的表名为Tag,而不是Tags,所以当然会抛出SqlExceptionSystem.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Tags'.

知道我做错了什么吗?

编辑:我不想更改表名称。如果添加迁移,EF会生成我的迁移/ sql表。怎么可能出现异常?

Tan*_*jel 6

DbContext DbSetTagpublic DbSet<Tag> Tags { get; set; }。在EF / EF Core中,DbContext的DbSet属性映射到数据库表。因此,它正在搜索的表名TagsTag为您DbSetTagTags

您可以通过以下任意一种方式解决此问题:

  1. public DbSet<Tag> Tag { get; set; }
  2. Tag表重命名为Tags
  3. modelBuilder.Entity<Tag>().ToTable("Tag");