Невозможно вставить явное значение для столбца идентификаторов в таблице 'Гарантия', когда для IDENTITY_INSERT установлено значение OFF - PullRequest
1 голос
/ 09 мая 2019

Я создаю метод правки HTTP Post Post, и когда я нажимаю кнопку Edit, я получаю сообщение об ошибке

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

Когда я проверяю таблицу [dbo].[Garancija], я вижу, что Identity ON

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; }


    }
}

Я также использую виртуальную машину для привязки выпадающего списка из 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; }




               }
}

Я также проверил эту ссылку здесь

Ссылка 1

Ссылка 2

Ссылка 3

Понятия не имею, где этоошибка, но я предполагаю, что ее проблема с базой данных.Пару раз я обновляю базу данных и проверяю, является ли 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 ]

1 голос
/ 09 мая 2019
set identity_insert [tablename] on
insert into [tablename] (columnlist) values(valuelist)
set identity_insert [tablename] off
1 голос
/ 13 мая 2019

После нескольких дней проверки удержания приложения я вижу ошибку в моем View

<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, поэтому я получаю ошибку Спасибо, ребята, однако! ! !

0 голосов
/ 09 мая 2019

Когда для параметра IDENTITY_INSERT установлено значение «OFF», мы не можем явно вставить данные в столбец идентификаторов.

Чтобы вставить данные в столбец идентификаторов, нам нужно установить для IDENTITY_INSERT значение «ON» для этой таблицы.

Кроме того, при явной вставке данных в столбец идентификаторов необходимо помнить, что столбец также будет Primary Key таблицы. Это означает, что ни значения null, ни duplicate не могут быть явно вставлены в этот столбец.

Если вы работаете с Entity Framework, вы можете попробовать эти две опции, чтобы явно вставить данные в столбец идентификаторов:

  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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...