c# - 在实体框架中执行存储过程 - 没有定义键。(代码优先)
问题描述
我正在尝试使用实体框架在 ASP.NET MVC 中执行存储过程。存储过程不会在返回的数据行中返回任何唯一键。
我收到此错误:
类型:System.Data.Entity.ModelConfiguration.ModelValidationException,EntityFramework,版本=6.0.0.0
消息:在模型生成期间检测到一个或多个验证错误:
SPProject.DTO.Result: : EntityType 'Result' 没有定义键。定义此 EntityType 的键。
结果:EntityType:EntitySet 'Results' 基于没有定义键的类型'Result'。
实体类:
public class Result
{
public string prop1 { get; set; }
public string prop2 { get; set; }
public string prop3 { get; set; }
public string prop4 { get; set; }
}
数据库上下文:
public class ResultDBContext : DbContext
{
public DbSet<Result> Results { get; set; }
}
控制器 :
using (var context = new ResultDBContext())
{
var input1 = new SqlParameter("@q1", q1);
var input2 = new SqlParameter("@q2", q2);
var input3 = new SqlParameter("@q3", "%");
var result = context.Results
.SqlQuery("[dbo].[sp] @q1, @q2, @q3", input1, input2, input3)
.ToList();
}
我读到了使用复杂类型而不是实体来映射没有键的存储过程的输出,但还没有理解一种方法。
解决方案
将 notmapped 属性添加到类
[NotMapped]
public class Result
{
......
}
如果您使用旧的 .net,您可以尝试在结果中添加一个键列
或者如果您使用网络核心,则添加到 dbcontext 的 OnModelCreating
modelBuilder.Entity<Result>(e =>
{
e.HasNoKey();
});
推荐阅读
- python - plotly python 中的 include_plotlyjs="cdn" 对生成的 HTML 有什么作用?
- python - Django 频道 - 如何从外部脚本向组发送消息?
- mysql - SUBSTRING 函数 mysql
- node.js - -bash: npm: 使用Node LTS安装包后找不到命令
- python - csv.writerow 在添加 for 循环后现在可以工作了吗?
- azure-devops-migration-tools - 使用 VSTS 同步迁移工具配置文件中的 DevOps 查询 ID 迁移 Azure DevOps 工作项
- sql - SQL:使用案例在单独的列中查找重复项和标记
- javascript - setState 函数没有有效地更新 rows 变量,因此它没有反映在 UI 中?
- python - 为什么在其包中导入的模块会带有自己的模块名称
- git - 从提交 ID 中查找父分支