问题描述
在EF core 3.1内,我试图运行一些自定义sql作为测试,以查看是否可以填充自定义对象。我的自定义对象称为 CustomPerson 。
public partial class CustomPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
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保留为仅文档形式。