Entity Framework Core 6:自定义存储过程结果模型的正确实现方式
问题解答
是的,使用.HasNoKey().ToView(null)是EF Core中处理这类仅用于接收存储过程/自定义查询返回结果、不对应数据库表的模型的公认正确方式。
原因说明
EF Core的迁移系统默认会认为每个注册的DbSet<T>都需要对应数据库中的一个表或视图。虽然.HasNoKey()已经将模型标记为无键实体,但EF Core仍会尝试为其生成表结构脚本,直到你通过.ToView(null)明确告知:该实体不映射到任何数据库对象(表或视图),迁移系统便会跳过相关的表创建逻辑。
替代方案
如果你不需要通过DbSet来访问这个模型,也可以直接在DbContext中定义返回查询结果的方法,无需注册DbSet,自然也不会触发迁移脚本生成:
public IQueryable<ustp_MyProcResults> GetMyProcResults() { return FromSqlRaw("EXEC ustp_MyProc").AsNoTracking(); }
但如果需要利用DbSet的LINQ组合、依赖注入等特性,DbSet<T>加.ToView(null)的配置方式依然是更合适的选择。
注意事项
这类无映射模型仅支持查询操作(比如接收存储过程结果),无法用于增、删、改操作,因为没有对应的数据库对象可以执行这些变更。
内容的提问来源于stack exchange,提问作者madvora
相关产品推荐
相关产品推荐

