实体框架核心3,定义查询数据库集,但不创建迁移条目

问题描述

在EF core 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();
     });
}

这可以工作并返回数据,但是当我运行以下迁移以检查它是否认为任何更改时。

Add-Migration anythingNew

它会创建 CustomPerson 表!我不要这需要是仅查询对象,并且不能存储或添加数据库中。

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

modelBuilder.Ignore<CustomPerson>();

任何人都可以帮我解决这个问题。因此,我希望它可用于查询自定义sql响应,但不包含在任何迁移中?

解决方法

我通过在末尾附加.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并尝试将其拉回作为我的对象时,它会炸毁。

,

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...