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 并尝试将其作为我的对象拉回时它爆炸了。
在 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 并尝试将其作为我的对象拉回时它爆炸了。