数据库并发异常

时间:2018-06-06 14:00:52

标签: c# entity-framework concurrency

我们正在为我们的研究项目开发一个数据库,在向表中添加数据时我们遇到了意外错误。

stack = [] # stack[0] is the top of the stack
buffer = [w1, w2, ..., wn]

while len(buffer) > 0 or len(stack) != 1:
    if stack[0] is the head of stack[1]:
        apply left-arc
    if stack[1] is the head of stack[0]:
        if there is a token in the buffer whose head is stack[0] 
            # (i.e not all children of stack[1] have been attached to it)
            apply shift
        else:
            apply right-arc

我们也尝试过:

  • 使用ExecuteSqlCommand添加新记录,效果很好

    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();
    }
    
  • 使用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;

  • 手动输入值(例如在ExecuteSqlCommand行中)

无论我们做什么,.Modified都会给我们

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

1 个答案:

答案 0 :(得分:0)

在您的C#Entity Framework代码中,您没有包含ID的值,这意味着您将其设置为自动递增为IDENTITY值。但是,在INSERT语句中,您包含了一个值,如果将其设置为IDENTIY值,则该值不起作用。要解决您的问题,您可以执行以下两项操作之一:

  1. 将您的ID列更改为自动增加。这样您就可以保留C#代码,并且它应该按预期工作而不提供值。如果您不想直接对插入的值负责,请执行此操作。

  2. ID列的EF代码中包含一个值:

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