C# ASP.NET-多次绑定模型

C# ASP.NET-多次绑定模型,c#,asp.net,http-post,model-binding,C#,Asp.net,Http Post,Model Binding,我有两种型号:机器和设备 它们之间的关系是:一台机器有一组设备 PostAction应该如何工作:当用户创建一台新机器时,他还将声明该机器拥有的设备数量 这样,如果为一台机器声明了3个设备,则必须在设备模型上保存3个寄存器 守则: 问题是: 例如,当指示2个设备时,以下是调试显示的内容: 如图所示,在第一次尝试中,DeviceID为0。第二次尝试是1006。此设备ID是自动生成的 此时,应用程序中断,声称: SqlException:当identity\u insert设置为OFF时,无法在表“

我有两种型号:机器和设备

它们之间的关系是:一台机器有一组设备

PostAction应该如何工作:当用户创建一台新机器时,他还将声明该机器拥有的设备数量

这样,如果为一台机器声明了3个设备,则必须在设备模型上保存3个寄存器

守则:

问题是:

例如,当指示2个设备时,以下是调试显示的内容:

如图所示,在第一次尝试中,DeviceID为0。第二次尝试是1006。此设备ID是自动生成的

此时,应用程序中断,声称:

SqlException:当identity\u insert设置为OFF时,无法在表“Device”中为identity列插入显式值

我相信这是因为它试图在一个关键字段设备ID上写一个零

同时,它还在数据库中保存一个寄存器:

但它保存了两次尝试的组合:1尝试1中的DeviceName,2尝试2中的DeviceID

有人能解释为什么在第一次尝试中DeviceID为零吗?如何解决这个问题?为什么它能挽救这两种尝试的混合呢


提前感谢。

从我在代码中可以看出,您的循环正在遍历它认为基于机器模型中自动绑定的设备数量的设备数量,我假设您的MVC表单上有手动输入的值

对于它拥有的每个设备,您实际上是在试图告诉Entity Framework在修改其属性并将其保存到数据库后添加相同的对象。在第一次SaveChanges调用之后,设备的Id列将更新为数据库分配给它的Id。如果您尝试再次将其添加到DBContext,它将尝试创建具有相同id的新设备,这是非法的,除非如它所说,IDENTITY_INSERT设置为ON。即使该设置处于启用状态,也将是非法的,因为可能存在唯一性约束

因此,第一件事是,更好的做法是先断开连接的模型,然后是一个数据层,该层将这些模型转换为实际实体,并将其插入数据库。但是,除此之外,像这样的东西每次都会创造一个新的设备,效果会更好:

        if (id == 0)
        {
            _context.Add(model);
            for (var items = 0; items < model.NumDevices; items++)
            {
                var contador = items + 1;
                string devicename = model.MchName + "-" + contador.ToString();
                var devNew = new Device();
                devNew.DeviceName = devicename;
                _context.Add(devNew);
                await _context.SaveChangesAsync();
            }
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }

此外,最后一个savechangessync似乎没有必要。确实,手工输入的表单附带了设备的数量。谢谢,我理解你的答案,我每次迭代都在同一台设备上反复工作,这很有意义。将更新项目并查看其运行情况。将查看最后一次保存的更改。如果循环中的一个已经保存了模型变量附带的机器信息,那么这确实是不必要的
        if (id == 0)
        {
            _context.Add(model);
            for (var items = 0; items < model.NumDevices; items++)
            {
                var contador = items + 1;
                string devicename = model.MchName + "-" + contador.ToString();
                var devNew = new Device();
                devNew.DeviceName = devicename;
                _context.Add(devNew);
                await _context.SaveChangesAsync();
            }
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }