数据读取器与指定的 [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.ExecuteFunction,这意味着您希望函数返回一些与某些请求类型匹配的行。但是正如您自己所说的那样-您的程序不会返回任何内容,因此会出现错误。只需使用不带泛型参数的 ExecuteFunction,并且不要从该方法返回任何内容 我删除了返回类型,这是有道理的,但是我仍然得到同样的异常。有什么想法吗? 您需要***.com/questions/24126767/… 之类的东西吗? 这个也不行。 【参考方案1】:

ExecuteFunction&lt;Request&gt; 必须具有 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&lt;Request&gt;

  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'。只支持初始化器实体成员和实体导航属性。

超赞的 Go 语言 INI 文件操作

类型的成员“PropertyName”在数据读取器中没有同名的对应列

为什么不同布局兼容类型的两个数组本身也不兼容布局?

在 oozie 工作流中读取 avro 数据文件时出错 - 类与新地图 API 模式不兼容

typeScript阅读笔记-类型兼容性