【发布时间】:2020-05-21 09:58:18
【问题描述】:
我需要在实体框架核心 3.1.1 中执行一个复杂的 sql 查询,在研究中我发现无键实体类型是代码优先方法的方式。我看到很多关于 dbquery 的文档,但这在 .net core 3.x 中被标记为过时
根据 Microsoft 文档,它说 dbquery 已过时,因此请改用 dbset 方法,但使用 dbset 它试图在数据库中创建一个新表。如何在应用迁移时禁用无密钥实体类型中的表生成?
示例代码
public class ApplicationContext : DbContext
{
public DbSet<CustomQuery> CustomQuery { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Ignore<CustomQuery>();
modelBuilder.Entity<CustomQuery>().HasNoKey();
}
}
使用 .net 核心 2.2
var entity = _context.Query<CustomQuery>().FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();
使用 .net 核心 3.1
var newEntity = _context.CustomQuery.FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();
如果我尝试应用迁移,则会创建一个名为自定义查询的新表,但我不需要发生这种情况。因为这只是一个用于保存连接查询中的值的模型,我不会插入、更新或删除该表中的值。如何做到这一点?
或者对于这种情况有没有更好的方法。
【问题讨论】:
-
您的查询是动态的还是静态的?
-
动态查询
-
很遗憾,Ef Core 3.x 存在一些限制。我们有两个选项来映射我们的查询: 1 - 将查询结果映射到实体(每个表)。 2 - 在数据库中创建一个视图,然后将自定义对象映射到该视图。也许第二个选项更好地做到这一点,以便在不创建表的情况下映射您的自定义类型。
-
非常感谢,也许现在我将与我们的团队进行内部讨论,并决定是继续使用过时的代码(不可接受)还是转而查看概念。
标签: c# entity-framework-core ef-core-3.0 ef-core-3.1