Исключение параллелизма базы данных - PullRequest
0 голосов
/ 06 июня 2018

мы работаем над базой данных для нашего учебного проекта и у нас возникла непредвиденная ошибка при добавлении данных в таблицу.

using (var ctx = new BazyDanychContext())
{
    Osoba tmpTask = new Osoba { Imie = ImieLbl.Text, Nazwisko = NazwiskoLbl.Text, Telefon = TelefonLbl.Text, Adres = AdresLbl.Text, Mail = MailLbl.Text, IloscTransakcji = Int32.Parse(IloscLbl.Text), Typ = TypList.Text };
    ctx.Osoba.Add(tmpTask);
    ctx.SaveChanges();
}

Мы также попытались:

  • Чтобы добавить новые записи, используя ExecuteSqlCommand, который работал просто отлично

    ctx.Database.ExecuteSqlCommand("INSERT INTO dbo.Osoba VALUES('0','jan','nowak', '222222', 'adres', 'mail', '2', 'osoba')");
    
  • Использование ctx.Entry(tmpTask).State = System.Data.Entity.EntityState.Added; (а также .Modified)

  • Ввод значений вручную (как в строке ExecuteSqlCommand)

Независимо от того, что мы делаем, ctx.SaveChanges() дает нам

OptimisticConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0).

Наши классы:

namespace BazyDanych
{ 
    public class BazyDanychContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }
        public BazyDanychContext() : base("ProjektBD")
        {
            Database.SetInitializer(new SQLdb());
        }

        public DbSet<Osoba> Osoba { get; set; }
    }
}

namespace BazyDanych
{
    public class Osoba
    {
        public int ID { get; set; }
        public string Imie { get; set; }
        public string Nazwisko { get; set; }
        public string Telefon { get; set; }
        public string Adres { get; set; }
        public string Mail { get; set; }
        public int IloscTransakcji { get; set; }
        public string Typ { get; set; }

        public override string ToString()
        {
            return "Imie: " + Imie + "\t Nazwisko: " + Nazwisko + "\t ID: " + ID.ToString();
        }
    }
}

Структура таблицы базы данных выглядит следующим образом:

ID (int, null)
Imie (text, null)
Nazwisko (text, null)
Telefon (text, null)
Adres (text, null)
Mail (text, null)
IloscTransakcji (int, null)
Typ (text, null)

1 Ответ

0 голосов
/ 06 июня 2018

Похоже, что в вашем коде C # Entity Framework вы не включаете значение для идентификатора, что подразумевает, что оно имеет автоматическое увеличение в качестве значения IDENTITY.Тем не менее, в вашем выражении INSERT вы включаете его значение, которое не будет работать, если оно будет установлено в качестве значения IDENTIY.Чтобы решить вашу проблему, вы можете сделать одно из двух:

  1. Измените свой столбец ID на автоинкремент. Это позволит вам сохранить ваш C #код, как он есть, и он должен работать, как ожидается, без предоставления значения.Сделайте это, если вы не хотите напрямую отвечать за введенное значение.

  2. Включите значение в код EF для столбца ID:

    using (var ctx = new BazyDanychContext())
    {
        Osoba tmpTask = new Osoba { ID = IDLbl.Text, Imie = ImieLbl.Text, Nazwisko = NazwiskoLbl.Text, Telefon = TelefonLbl.Text, Adres = AdresLbl.Text, Mail = MailLbl.Text, IloscTransakcji = Int32.Parse(IloscLbl.Text), Typ = TypList.Text };
        ctx.Osoba.Add(tmpTask);
        ctx.SaveChanges();
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...