Entity Framework核心3,为查询定义DBSet但不创建迁移条目

Entity Framework Core 3, Define DBSet for query but dont create migration entry

在 EF 核心 3.1 中,我正在尝试 运行 一些自定义 SQL 作为测试,看看我是否可以填充自定义对象。我的自定义对象称为 CustomPerson.

public partial class CustomPerson
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

运行 SQL 的代码如下:

public List<CustomPerson> GetCustomPersonSql()
{
    var persons = _context.CustomPerson.FromSqlRaw("SELECT FirstName, LastName FROM Person");
    return persons.ToList();
}

我在上下文文件中声明如下,注意HasNoKey()。

public DbSet<CustomPerson> CustomPerson { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder) {
     modelBuilder.Entity<CustomPerson>(entity =>
     {
          entity.HasNoKey();
     });
}

这有效并且 returns 数据,但是当我 运行 下面的迁移检查它是否认为有任何变化时。

Add-Migration anythingNew

它创建了 CustomPerson table!我不想要。这需要是一个仅供查询的对象,而不是存储或添加到数据库中。

我在 OnModelCreating 中尝试了以下方法,但这会停止查询工作。

modelBuilder.Ignore<CustomPerson>();

谁能帮我解决这个问题。所以我希望它用于查询自定义 SQL 响应,但不包含在任何迁移中?

您可以从生成的迁移的 Up() 和 Down() 中删除与该“实体”相关的所有内容,这不会在运行时造成任何问题。

迁移不是神圣不可侵犯的,也不是黑魔法。建议始终检查 EF 生成的迁移并根据需要进行任何修改。例如,您可以在 SQL 服务器中使用 NO CHECK 修改所有外键约束,将您的外键仅保留为文档。

我通过在末尾附加 .ToView 来完成这项工作,如下所示

modelBuilder.Entity<CustomPerson>(entity =>
{
    entity.HasNoKey()
          .ToView(null);
});

所以 HasNoKey 似乎允许我像这样使用它

var persons = _context.CustomPerson.FromSqlRaw("SELECT FirstName, LastName FROM Person");
return persons.ToList();

然后 ToView 确保在创建迁移时忽略它

如果我尝试像有人提到的那样使用它

modelBuilder.Ignore<CustomPerson>();

然后我没有得到迁移,但是我不能将对象用作域对象!因为当我执行 SELECT 并尝试将其作为我的对象拉回时它爆炸了。