当IDENTITY_INSERT设置为OFF时,无法为表“ Garancija”中的标识列插入显式值

时间:2019-05-09 06:46:46

标签: c# asp.net-core-mvc

我正在创建Edit HTTP Post Action Method,当我按下Edit按钮时出现错误

Cannot insert explicit value for identity column in table 'Garancija' when IDENTITY_INSERT is set to OFF.

当我检查表[dbo].[Garancija]时,我发现Identity已启用

CREATE TABLE [dbo].[Garancija] (
    [ProduzenaGarancijaID]  INT            IDENTITY (1, 1) NOT NULL,
    [Broj_Police]           INT            NOT NULL,
    [GeneralniUgovor]       INT            NOT NULL,
    [ImeVlasnika]           NVARCHAR (MAX) NULL,
    [Adresa_Ulica]          NVARCHAR (MAX) NULL,
    [Adresa_Broj]           NVARCHAR (MAX) NULL,
    [Adresa_PBroj]          NVARCHAR (MAX) NULL,
    [Adresa_Mjesto]         NVARCHAR (MAX) NULL,
    [JMBG]                  NVARCHAR (MAX) NULL,
    [VrsteVozilaID]         INT            NOT NULL,
    [MarkaVozilaID]         INT            NOT NULL,
    [ModelVozilaID]         INT            NOT NULL,
    [Sasija]                NVARCHAR (MAX) NULL,
    [Snaga]                 NVARCHAR (MAX) NULL,
    [Zapremina]             NVARCHAR (MAX) NULL,
    [VrstaMjenjacaID]       INT            NOT NULL,
    [Is4x4]                 BIT            NULL,
    [Predjeni_Kilometri]    NVARCHAR (MAX) NULL,
    [Kupovna_Vrijednost]    NVARCHAR (MAX) NULL,
    [Namjena]               NVARCHAR (MAX) NULL,
    [GorivoID]              INT            NOT NULL,
    [DatumPrveRegistracije] NVARCHAR (MAX) NULL,
    [DatumPrveProdaje]      NVARCHAR (MAX) NULL,
    [DatumKupovineVozila]   NVARCHAR (MAX) NULL,
    [DatumPocetkaGarancije] NVARCHAR (MAX) NULL,
    [DatumIstekaGarancije]  NVARCHAR (MAX) NULL,
    [TrajanjeGarancije]     NVARCHAR (MAX) NULL,
    [LimitPokrica]          NVARCHAR (MAX) NULL,
    [OgranicenjeKm]         FLOAT (53)     NULL,
    [ProduktID]             INT            NOT NULL,
    [ProgramPokrica]        NVARCHAR (MAX) NULL,
    [CjenovnikID]           INT            NOT NULL,
    [Cijena]                FLOAT (53)     NOT NULL,
    [DatumUnosta]           NVARCHAR (MAX) NULL,
    [DatumPromjene]         NVARCHAR (MAX) NULL,
    [BrojPotvrde]           INT            NOT NULL,
    CONSTRAINT [PK_Garancija] PRIMARY KEY CLUSTERED ([ProduzenaGarancijaID] ASC),
    CONSTRAINT [FK_Garancija_VrsteMjenjaca_VrstaMjenjacaID] FOREIGN KEY ([VrstaMjenjacaID]) REFERENCES [dbo].[VrsteMjenjaca] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Garancija_VrsteVozila_VrsteVozilaID] FOREIGN KEY ([VrsteVozilaID]) REFERENCES [dbo].[VrsteVozila] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Garancija_Cjenovnik_CjenovnikID] FOREIGN KEY ([CjenovnikID]) REFERENCES [dbo].[Cjenovnik] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Garancija_Gorivo_GorivoID] FOREIGN KEY ([GorivoID]) REFERENCES [dbo].[Gorivo] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Garancija_MarkeVozila_MarkaVozilaID] FOREIGN KEY ([MarkaVozilaID]) REFERENCES [dbo].[MarkeVozila] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Garancija_Modeli_ModelVozilaID] FOREIGN KEY ([ModelVozilaID]) REFERENCES [dbo].[Modeli] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_Garancija_Produkti_ProduktID] FOREIGN KEY ([ProduktID]) REFERENCES [dbo].[Produkti] ([Id]) ON DELETE CASCADE
);

到目前为止,我所做的是尝试调试应用程序,但编译器未进入方法

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using TriglavOsiguranje.Data;
using TriglavOsiguranje.Models.ViewModels;
using TriglavOsiguranje.Models;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Net;

namespace TriglavOsiguranje.Areas.Uposlenik.Controllers
{
    [Area("Uposlenik")]
    public class GarancijaController : Controller
    {
        private ApplicationDbContext _db;

        [BindProperty]
        public GarancijaViewModel GarancijaVM { get; set; }

        public GarancijaController(ApplicationDbContext db)
        {
            _db = db;

            GarancijaVM = new GarancijaViewModel()
            {
                Gorivo = _db.Gorivo.ToList(),
                Cijenovnik = _db.Cjenovnik.ToList(),
                MarkeVozila = _db.MarkeVozila.ToList(),
                ModeliVozila = _db.Modeli.ToList(),
                Produkt = _db.Produkti.ToList(),
                VrstaMjenjaca = _db.VrsteMjenjaca.ToList(),
                VrstaVozila = _db.VrsteVozila.ToList(),
                Garancija = new ProduzenaGarancija()
            };
        }
        public async Task<IActionResult> Index()
        {
            var garancija = _db.Garancija.Include(m => m.MarkaVozila).Include(m => m.ModelVozila).Include(m => m.VrsteVozila);
            return View(await garancija.ToListAsync());
        }

        //GET : Product Create
        public IActionResult Create()
        {
            return View(GarancijaVM);
        }

        [HttpPost, ActionName("Create")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> CreatePOST()
        {
            if (ModelState.IsValid)
            {
                _db.Garancija.Add(GarancijaVM.Garancija);
                await _db.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(GarancijaVM);
        }



        //GET Edit
        public async Task<IActionResult> Edit(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }

            GarancijaVM.Garancija = await _db.Garancija.Include(m => m.Gorivo)
                 .Include(m => m.MarkaVozila).Include(m => m.ModelVozila)
                .Include(m => m.Produkt).Include(m => m.VrstaMjenjaca)
                .Include(m => m.VrsteVozila).Include(m => m.Cjenovnik)
                .SingleOrDefaultAsync(m => m.ProduzenaGarancijaID == Id);

            return GarancijaVM.Garancija == null ? NotFound() : (IActionResult)View(GarancijaVM);
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, ProduzenaGarancija garancija)
        {
            if (id != garancija.ProduzenaGarancijaID)
            {
                return NotFound();
            }

            if (ModelState.IsValid)
            {
                _db.Update(garancija);
                await _db.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(garancija);
        }


        //GET: Details Garancija
        public async Task<IActionResult> Details(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }

            GarancijaVM.Garancija = await _db.Garancija.Include(m => m.Gorivo)
                .Include(m => m.Gorivo).Include(m => m.MarkaVozila).Include(m => m.ModelVozila)
                .Include(m => m.Produkt).Include(m => m.VrstaMjenjaca).Include(m => m.VrsteVozila)
                .SingleOrDefaultAsync(m => m.ProduzenaGarancijaID == Id);

            if (GarancijaVM.Garancija == null)
            {
                return NotFound();
            }
            return View(GarancijaVM);
        }

        //GET: Delete GarancijaVM
        public async Task<IActionResult> Delete(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }

            GarancijaVM.Garancija = await _db.Garancija.Include(m => m.Gorivo)
                .Include(m => m.Gorivo).Include(m => m.MarkaVozila).Include(m => m.ModelVozila)
                .Include(m => m.Produkt).Include(m => m.VrstaMjenjaca).Include(m => m.VrsteVozila)
                .SingleOrDefaultAsync(m => m.ProduzenaGarancijaID == Id);

            if (GarancijaVM.Garancija == null)
            {
                return NotFound();
            }
            return View(GarancijaVM);
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Delete(int id)
        {
            ProduzenaGarancija produzena = await _db.Garancija.FindAsync(id);

            if (produzena == null)
            {
                return NotFound();
            }
            else
            {
                _db.Garancija.Remove(produzena);
                await _db.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
        }
    }
}

第二次认为我做的是我的模型,但我没有纠正错误

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

这是我的模特

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace TriglavOsiguranje.Models
{
    public class ProduzenaGarancija
    {
        /*Podaci o vlasniku*/
        [Key]    
        public int ProduzenaGarancijaID { get; set; }

        public int Broj_Police { get; set; }

        public int GeneralniUgovor { get; set; }

        public string ImeVlasnika { get; set; }

        public string Adresa_Ulica { get; set; }

        public string Adresa_Broj { get; set; }

        public string Adresa_PBroj { get; set; }

        public string Adresa_Mjesto { get; set; }

        public string JMBG { get; set; }

                 /* Podaci o vozilu */

        [Display(Name ="Vrste Vozila")]
        public int VrsteVozilaID { get; set; }

        [ForeignKey("VrsteVozilaID")]
        public virtual VrstaVozila VrsteVozila { get; set; }

        [Display(Name = "Marka vozila")]
        public int MarkaVozilaID { get; set; }

        [ForeignKey("MarkaVozilaID")]
        public virtual MarkeVozila MarkaVozila { get; set; }

        [Display(Name = "Model vozila")]
        public int ModelVozilaID { get; set; }

        [ForeignKey("ModelVozilaID")]
        public virtual ModeliVozila ModelVozila { get; set; }

        public string Sasija { get; set; }

        public string Snaga { get; set; }

        public string Zapremina { get; set; }

        [Display(Name = "Vrsta mjenjaca")]
        public int VrstaMjenjacaID { get; set; }

        [ForeignKey("VrstaMjenjacaID")]
        public virtual VrstaMjenjaca VrstaMjenjaca { get; set; }

        public bool Is4x4 { get; set; }

        public string Predjeni_Kilometri { get; set; }

        public string Kupovna_Vrijednost { get; set; }

        public string Namjena { get; set; }

        [Display(Name = "Vrsta goriva")]
        public int GorivoID { get; set; }

        [ForeignKey("GorivoID")]
        public virtual Gorivo Gorivo { get; set; }

        /* Podaci o garanciji */

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public string DatumPrveRegistracije { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public string DatumPrveProdaje { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public string DatumKupovineVozila { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public string DatumPocetkaGarancije { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public string DatumIstekaGarancije { get; set; }

        public string TrajanjeGarancije { get; set; }

        public string LimitPokrica { get; set; }

        public double OgranicenjeKm { get; set; }

        [Display(Name = "Produkt/Nacin prodaje")]
        public int ProduktID { get; set; }

        [ForeignKey("ProduktID")]
        public virtual Produkt Produkt { get; set; }

        public string ProgramPokrica { get; set; }

        [Display(Name = "Cjenovnik / Zapremina Vozila")]
        public int CjenovnikID { get; set; }

        [ForeignKey("CjenovnikID")]
        public virtual Cjenovnik Cjenovnik { get; set; }

        public double Cijena { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public string DatumUnosta { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public string DatumPromjene { get; set; }

        public int BrojPotvrde { get; set; }


    }
}

我也在使用VM绑定db的下拉列表

using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TriglavOsiguranje.Models.ViewModels
{
    public class GarancijaViewModel
    {
        public ProduzenaGarancija Garancija { get; set; }

        public IEnumerable<Cjenovnik> Cijenovnik { get; set; }
        public IEnumerable<Gorivo> Gorivo { get; set; }
        public IEnumerable<MarkeVozila> MarkeVozila { get; set; }
        public IEnumerable<ModeliVozila> ModeliVozila { get; set; }
        public IEnumerable<Produkt> Produkt { get; set; }
        public IEnumerable<VrstaMjenjaca> VrstaMjenjaca { get; set; }
        public IEnumerable<VrstaVozila> VrstaVozila { get; set; }




               }
}

我也在这里检查了此链接

Link 1

Link 2

Link 3

我不知道此错误来自何处,但我认为它与数据库有关。 几次我更新数据库并检查Is Identity = true,但不能解决我的问题 任何建议或评论可能是什么问题?

编辑

Project.Areas.Uposlenik.Controllers.GarancijaController.Create(ProduzenaGarancija garancija) in GarancijaController.cs
-
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(ProduzenaGarancija garancija)
        {
            if (ModelState.IsValid)
            {
                _db.Garancija.Add(garancija);
                await _db.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(garancija);
        }

3 个答案:

答案 0 :(得分:1)

public static void click(By... by){
    int count=by.length;
    for(By locator:by){
        if(isElementPresent(locator)) {
            getDriver().findElement(locator).click();
            break;
        }
        count--;
    }
    if(count<0)
        assertTrue(false,"Count not find element.");
}

public static boolean isElementPresent(By selector)
{
    try {
        driver.findElement(selector);
        return true;
    }
    catch (Exception e) {
            return false;
    }
}

答案 1 :(得分:1)

几天检查保留应用程序后,我发现视图中出现错误

<div class="form-group text-center">
            <input type="submit" class="btn btn-primary" asp-asp-route-id="@Model.Garancija.Id" value="Izmijeni" />
            <a asp-action="Index" class="btn btn-success">Nazad</a>
        </div>

出于某种原因asp-asp-route-id="@Model.Garancija.Id",我检查我是否有双asp-asp,这就是为什么我会出错 谢谢你们! ! !

答案 2 :(得分:0)

当“ IDENTITY_INSERT”设置为“ OFF”时,我们无法将数据明确插入身份列。

为了将数据插入标识列,我们需要将该表的“ IDENTITY_INSERT”设置为“ ON”。

此外,在将数据显式插入到identity列中时,我们需要记住该列也将是表的Primary Key。 这意味着nullduplicate的值都不允许显式插入到该列。

如果使用Entity Framework,则可以尝试以下两个选项将数据显式插入到Identity列中:

  1. 在下面的代码中执行您在_db.Update(garancija)方法中调用Edit的地方
_db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Garancija ON");
_db.Update(garancija);
_db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Garancija OFF");
await _db.SaveChangesAsync();
  1. 对于Key列,即模型类中的ProduzenaGarancijaID,您可以设置属性[DatabaseGenerated(DatabaseGeneratedOption.None)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]    
public int ProduzenaGarancijaID { get; set; }