EF Core 生成具有无效 table 名称的语句
EF Core generates statement with invalid table name
我正在尝试使用 Include
和 ThenInclude
获取一些值,但 EF Core 生成了一个包含无效 tablename.
的语句
这是我的 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; }
}
base-classEntity
包含主键属性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]
那是错误的,因为我的table被称为Tag
,而不是Tags
,所以当然会抛出一个SqlException System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Tags'.
知道我做错了什么吗?
编辑: 我不想更改 table 的名字。如果我添加迁移,EF 会生成我的 migration/sql-table。怎么会出现异常?
你的 DbContext
DbSet
Tag
是 public DbSet<Tag> Tags { get; set; }
。在 EF/EF 中,核心 DbContext 的 DbSet
属性映射到数据库 table。因此它正在搜索 table name Tags
for Tag
因为你的 DbSet
for Tag
是 Tags
.
您可以通过以下任一方式解决:
public DbSet<Tag> Tag { get; set; }
- 将
Tag
table 重命名为 Tags
modelBuilder.Entity<Tag>().ToTable("Tag");
我正在尝试使用 Include
和 ThenInclude
获取一些值,但 EF Core 生成了一个包含无效 tablename.
这是我的 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; }
}
base-classEntity
包含主键属性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]
那是错误的,因为我的table被称为Tag
,而不是Tags
,所以当然会抛出一个SqlException System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Tags'.
知道我做错了什么吗?
编辑: 我不想更改 table 的名字。如果我添加迁移,EF 会生成我的 migration/sql-table。怎么会出现异常?
你的 DbContext
DbSet
Tag
是 public DbSet<Tag> Tags { get; set; }
。在 EF/EF 中,核心 DbContext 的 DbSet
属性映射到数据库 table。因此它正在搜索 table name Tags
for Tag
因为你的 DbSet
for Tag
是 Tags
.
您可以通过以下任一方式解决:
public DbSet<Tag> Tag { get; set; }
- 将
Tag
table 重命名为Tags
modelBuilder.Entity<Tag>().ToTable("Tag");