我有以下代码:
public void Crear(UsuarioDto registro) {
VisitantesEntities db = new VisitantesEntities();
registro.Id = Convert.ToInt32(db.SpUsuarioMaxId());
db.SpCrearUsuario(registro.Id, registro.Nombre, registro.Correo, registro.CodigoAcceso, registro.ClaveAcceso, registro.UsuarioId, registro.RolId);
db.SaveChanges();
}
收到记录对象后,使用存储过程将其值存储在数据库中SpCrearUsuario
。但是,首先我必须找到最后一个用户的 Id,为此我使用了存储过程SpUsuarioMaxId
,但是当尝试转换此存储过程的结果以便Int
能够为其分配值时,registro.Id
会显示以下错误:
System.InvalidCastException: 'Unable to cast object of type 'System.Data.Entity.Core.Objects.ObjectResult`1[System.Nullable`1[System.Int32]]' to type 'System.IConvertible'.'
是否可以将对象的结果转换为整数?
存储过程的代码是这样的:
USE [Visitantes]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SpUsuarioMaxId]
AS
BEGIN
SELECT MAX(Id) AS MaxId
FROM Usuario
END;
正如@Japh Sxas在他的评论中提到的那样,类型
ObjectResult<T>
implementsIEnumerable<T>
,因此您的过程可能会返回多个元素,以获得您想要的值(如果只有一条记录将作为该查询的产品存在),您可以做:方法一:
更改此行:
经过:
要使用该功能
FirstOrDefault()
,您必须using System.Linq;
在文件的开头执行。方法2 (未测试):
我还没有尝试过这种方法,但它应该可以工作。将存储过程定义更改为:
通过该修改,您的存储过程应该能够直接将值作为整数返回,在进行该修改后,您必须更新您的实体框架模型,以便返回类型发生变化。
干杯,
试着修改一下,好像返回值是
null
.为避免该问题,请使用
ISNULL
但请记住,您必须将一个添加到您获得的 id 以生成以下内容
如果那个id不能定义为
IDENTITY
db表中的,也就是autonumerical的话,我也推荐evalues,所以在执行insert的时候会自动增加