数据读取器与指定的 [X] 不兼容。类型的成员
Posted
技术标签:
【中文标题】数据读取器与指定的 [X] 不兼容。类型的成员【英文标题】:The data reader is incompatible with the specified [X]. A member of the type 【发布时间】:2021-02-28 19:08:21 【问题描述】:我是 ASP.NET MVC 的新手,在调用插入记录的存储过程时收到此错误消息:
数据读取器与指定的“SITHModel.Request”不兼容。类型的成员“ID”在数据读取器中没有同名的对应列。
在 return 语句中抛出异常。
public virtual ObjectResult<Request> AddRequest(Nullable<int> routeID, string email, string description, string aDDEDBYID)
var routeIDParameter = routeID.HasValue ?
new ObjectParameter("RouteID", routeID) :
new ObjectParameter("RouteID", typeof(int));
var emailParameter = email != null ?
new ObjectParameter("Email", email) :
new ObjectParameter("Email", typeof(string));
var descriptionParameter = description != null ?
new ObjectParameter("Description", description) :
new ObjectParameter("Description", typeof(string));
var aDDEDBYIDParameter = aDDEDBYID != null ?
new ObjectParameter("ADDEDBYID", aDDEDBYID) :
new ObjectParameter("ADDEDBYID", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Request>("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);
AddRequest 在下面。
ALTER PROCEDURE [dbo].[AddRequest]
(@RouteID int,
@Email nvarchar(100),
@Description nvarchar(4000),
@AddedByIDnvarchar(128))
AS
BEGIN
INSERT INTO Request (RouteID, Email, Description, AddedByID, ChangedByID)
VALUES (@RouteID, @Email, @Description, @AddedByID, @AddedByID)
END
我不希望存储过程返回任何内容,并且我对其他类似模型和存储过程没有问题。
控制器
// POST: Requests/Create
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,RouteID,Email,Description,AddedByID,ChangedByID,DateAdded,DateChanged")] Request request)
if (ModelState.IsValid)
var userID = "00000000-0000-0000-0000-000000000001";
if (User.Identity.IsAuthenticated)
userID = User.Identity.GetUserId();
db.AddRequest(request.RouteID, request.Email, request.Description, userID);
return RedirectToAction("ThankYou");
ViewBag.AddedByID = new SelectList(db.AspNetUsers, "Id", "Email", request.AddedByID);
ViewBag.ChangedByID = new SelectList(db.AspNetUsers, "Id", "Email", request.ChangedByID);
ViewBag.RouteID = new SelectList(db.Routes, "ID", "Name", request.RouteID);
return View(request);
知道我可以更新或删除什么来使其正常工作吗?
【问题讨论】:
new ObjectParameter("RouteID", typeof(int)) 会将类型 Int32 添加为参数值,对吗?也许你想要 new ObjectParameter("RouteID", default(int)) ? 您正在执行 ((IObjectContextAdapter)this).ObjectContext.ExecuteFunctionExecuteFunction<Request>
必须具有 Request
类型的输出。
在存储过程结束时,编写一个返回 Request
对象列的 Select。
这些列必须对应于Request
对象类属性。
你也可以跳过写泛型。
改变
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Request>("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);
到
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);
但如果你需要存储过程的结果,首先将存储过程更改为
ALTER PROCEDURE [dbo].[AddRequest]
(@RouteID int,
@Email nvarchar(100),
@Description nvarchar(4000),
@AddedByIDnvarchar(128))
AS
BEGIN
INSERT INTO Request (RouteID, Email, Description, AddedByID, ChangedByID)
VALUES (@RouteID, @Email, @Description, @AddedByID, @AddedByID)
SELECT * FROM Request
END
然后使用ObjectContext.ExecuteFunction
和<Request>
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Request>("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);
【讨论】:
你检查过没有NULL的参数吗?【参考方案2】:我最终不得不从我的模型中删除这个实体,删除控制器,然后重新添加实体和控制器。像魅力一样工作!
【讨论】:
【参考方案3】:由于它不是模型的一部分且操作不需要,请尝试从控制器 Create()
API 的 Bind 属性中删除 ID
:
public ActionResult Create([Bind(Include = "RouteID,Email,Description,AddedByID,ChangedByID,DateAdded,DateChanged")] Request request)
而不是
public ActionResult Create([Bind(Include = "ID,RouteID,Email,Description,AddedByID,ChangedByID,DateAdded,DateChanged")] Request request)
【讨论】:
以上是关于数据读取器与指定的 [X] 不兼容。类型的成员的主要内容,如果未能解决你的问题,请参考以下文章
在LINQ to Entities中不支持指定的类型成员'x'。只支持初始化器实体成员和实体导航属性。
类型的成员“PropertyName”在数据读取器中没有同名的对应列