【发布时间】:2017-03-21 21:34:20
【问题描述】:
我有一个无法重写的旧版 mvc 应用程序。有一个存储过程,它返回表A 的所有列名,ID 除外。 (注意,它实际上并没有从表 A 中选择,而是恰好返回了相同的列名)。我希望调用存储过程(通过 SQL 查询),并将结果分配给 A 类的变量。但是,我得到一个 System.Data.Entity.Core.CommandExecutionException 说 “ID”类型的成员没有相应的列在同名的数据阅读器中。
我的代码如下:
A类
namespace LegacyApp.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
public partial class A
{
[NotMapped]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public Nullable<int> SOId { get; set; }
public string SODesc { get; set; }
//...
}
}
我的控制器
public class MyController : Controller
{
private MyDBContext db = new MyDBContext();
//...
[HttpPost]
[ValidateInput(false)]
[OutputCache(NoStore = true, Duration = 0)]
public ActionResult Index(ViewModel rb)
{
var query = this.buildQuery().ToString();
// The results returned by the query contain all members of A except for ID
IEnumerable<A> goals = db.Database.SqlQuery<A>(query);
// Exception occurs here
List<A> goalList = goals.ToList();
rb.goalList;
return View(rb);
}
}
.edmx 设计器中的 ID 属性
我假设[NotMapped] 或[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 注释应该忽略ID?我这样做的原因是因为用户将过滤查询的数据集,然后将过滤后的结果插入到表 A 中。由于表 A 使用具有自动递增的 PK ID,我希望 ID插入时为NULL。我已经从实体设计器更新了我的模型,但我仍然收到错误消息。这样做的正确方法是什么?
【问题讨论】:
-
看看DatabaseGeneratedOption.Identity
-
我的意思是返回 ID,但是使用 Identity 属性来表明这是 DB 应该触及的东西。
-
1)您需要从 sql 中返回 ID 2)您不需要 [NotMapped] 属性 3)您确实需要 Identity 属性。有了所有这些,db 将返回带有 ID 的整个实体(并且实体框架需要每个对象的密钥),数据库将使用自动增量更新 ID,然后 EF 将获取该 ID。
-
不幸的是,sp 没有返回 ID(我无法修改它)。话虽如此,还有其他方法吗?
标签: c# sql-server entity-framework