繁体   English   中英

首先将较少的参数发送到由EF代码生成的存储过程

[英]send fewer parameters to stored procedure generated by EF code first

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

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

我试图在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指定了太多参数

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM