【问题标题】:send fewer parameters to stored procedure generated by EF code first首先向EF代码生成的存储过程发送更少的参数
【发布时间】:2016-05-11 05:38:06
【问题描述】:

我的应用程序首先使用 EF 6 代码

我有一个带有一些非必需属性的模型,我使用模型构建器生成存储过程,问题是我不想在插入或更新期间将非必需字段发送到数据库,因为它们中的大多数都具有默认约束

我尝试在 sqlserver 中编辑存储过程的定义,但我似乎无法将其与 EF 同步,它显示“指定的参数过多”,

我尝试生成迁移,然后编辑了存储过程的定义,但是当我更新数据库时,它说对象已经存在。

有没有办法将任意数量的参数发送到数据库和

有没有办法将已编辑的存储过程同步到 EF

我们将不胜感激每一个建议

编辑: 型号

 public class BattalionDetails
    {

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public short ID { get; set; }

        [MaxLength(300)]
        [Required]
        [DisplayName("Battallion Name")]
        public string BattalionName { get; set; }


        [MaxLength(50)]
        [Required]
        [DisplayName("Battallion NO")]
        public string BattalionNO { get; set; }

        [DisplayName("Number Of Person In Batallion")]
        public short NumberOfCadetsInBatallion { get; set; }

        [DisplayName("Description (if any)")]

        [DataType(DataType.MultilineText)]
        public string  Description { get; set; }

        public bool IsSynced { get; set; } = false;
        public bool IsActive { get; set; } = true;
        public bool IsDeleted { get; set; } = false;
    }

这里是存储过程

ALTER PROCEDURE [dbo].[BattalionDetails_Insert]
    @BattalionName [nvarchar](300),
    @BattalionNO [nvarchar](50),
    @NumberOfCadetsInBatallion [smallint],
    @Description [nvarchar](max)
AS
BEGIN
    INSERT [dbo].[BattalionDetails]([BattalionName], [BattalionNO], [NumberOfCadetsInBatallion], [Description])
    VALUES (@BattalionName, @BattalionNO, @NumberOfCadetsInBatallion, @Description)

    DECLARE @ID smallint
    SELECT @ID = [ID]
    FROM [dbo].[BattalionDetails]
    WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()

    SELECT t0.[ID]
    FROM [dbo].[BattalionDetails] AS t0
    WHERE @@ROWCOUNT > 0 AND t0.[ID] = @ID
END

这里是控制器部分:

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "BattalionName,BattalionNO,NumberOfCadetsInBatallion,Description")] BattalionDetails battalionDetails)
        {
            if (ModelState.IsValid)
            {

                db.BattalionDetails.Add(battalionDetails);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(battalionDetails);
        }

编辑 2:

这是表定义

CREATE TABLE [dbo].[BattalionDetails](
    [ID] [smallint] IDENTITY(1,1) NOT NULL,
    [BattalionName] [nvarchar](300) NOT NULL,
    [BattalionNO] [nvarchar](50) NOT NULL,
    [NumberOfCadetsInBatallion] [smallint] NOT NULL,
    [Description] [nvarchar](max) NULL,
    [IsSynced] [bit] NULL DEFAULT ((0)),
    [IsActive] [bit] NULL DEFAULT ((1)),
    [IsDeleted] [bit] NULL DEFAULT ((0)),
 CONSTRAINT [PK_dbo.BattalionDetails] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

我得到的例外是

过程或函数 BattalionDetails_Insert 指定的参数过多

【问题讨论】:

  • 你应该分享你的 SP 和型号代码
  • @Patel 我更新了问题
  • 你没有设置存储过程参数的默认值
  • @AksheyBhat 检查一下,我添加了表格详细信息
  • 您是否也在为 ID 列发送值?

标签: c# sql-server entity-framework stored-procedures


【解决方案1】:

尝试在存储过程中设置默认值

ALTER PROCEDURE [dbo].[BattalionDetails_Insert]
    @BattalionName [nvarchar](300) = null,
    @BattalionNO [nvarchar](50) = null,
    @NumberOfCadetsInBatallion [smallint] = 0,
    @Description [nvarchar](max)
AS

以上代码设置了 3 个参数的默认值,现在这些参数在您的代码中应该是可选的。

【讨论】:

  • 这些字段是必需的,请查看表创建代码我在那里设置了默认值,因此如果我不提供它们,将设置默认值
  • 我只是举了一个例子。如果您想在 SQL 中设置默认约束中的值,那么只需在存储过程中将默认参数值设置为 NULL。这样,当您不会从代码中传递此类变量的值时,它将采用默认设置的值 constraint
  • 但问题是我不想在不需要的情况下将值发送到数据库,我的意思是为了提高效率,否则默认的脚手架代码可以正常工作
猜你喜欢
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多