【问题标题】:SQL Exception violation of primary key constraint when updating data更新数据时违反主键约束的 SQL Exception
【发布时间】:2017-07-18 20:34:01
【问题描述】:
private void FormRentBook_Load(object sender, EventArgs e)
    {
        librarydb sorgu = new library();
        var book = from booklist in query.k_Books
                    join isrent in query.k_Bookstatus
                    on booklist.Book_statusId equals isrent.k_typeid
                    join booktype in query.k_BookType
                    on booklist.book_type equals booktype.ID
                    select new
                    {

                       booklist.Book_Name,
                       booklist.Book_Author,
                       booktype.Book_type,
                       booklist.Book_Page,
                       booklist.ID,
                       isrent.k_typecomment,
                    };
        bookscreen.DataSource = book.ToList();
        bookscreen.Columns[0].HeaderText = "Book Name";
        bookscreen.Columns[1].HeaderText = "bookscreen Author";
        bookscreen.Columns[2].HeaderText = "Book Type";
        bookscreen.Columns[3].HeaderText = "Page Number";
        bookscreen.Columns[4].Visible = false;
        bookscreen.Columns[5].HeaderText = "Book Status";
        bookscreen.Show();
        label6.Text = DateTime.Now.ToString();
        comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;

    }
        public int a;
    private void bookscreen_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        label1.Text = bookscreen.CurrentRow.Cells[0].Value.ToString();
        label2.Text = bookscreen.CurrentRow.Cells[1].Value.ToString();
        a =int.Parse( bookscreen.CurrentRow.Cells[4].Value.ToString());
        label3.Text = bookscreen.CurrentRow.Cells[5].Value.ToString();
    }

k_Rentedbooks rent = new k_Rentedbooks();
rent.renter_id = Login.k_id;
rent.renter_id = int.Parse(bookscreen.CurrentRow.Cells[4].Value.ToString());
rent.rent_date = DateTime.Now;

DateTime return = DateTime.Now;
int day;
day = Convert.ToInt32(comboBox1.SelectedItem.ToString());

rent.returndate = return.AddDays(day);
db.k_Rentedbooks.Add(rent);

var updatebook = db.k_Books.Where(w => w.ID ==a).FirstOrDefault();
updatebook.Kitap_statusId = 2;
db.SaveChanges();

我需要向 k_KiralananKitaplar 添加数据并更新名为 Kitap_DurumId = 2 的行,但我只能一次添加数据或更新我不能做的 db.SaveChanges 给我错误

以下是数据示例:

  • Kitap_Adi = 书名,
  • Kitap_Yazar = book_author,
  • Kitap_Tur = 书籍类型,
  • Kitap_Sayfa = 书页,
  • Kitap_DurumId = 图书状态

错误信息是

SqlException:违反主键约束“PK_k_KiralananKitaplar”。无法在对象“dbo.k_KiralananKitaplar”中插入重复键。重复键值为 (0)。

【问题讨论】:

  • 请不要让我们猜测错误是什么 - 更具体,并在您的问题中包含类似的信息。
  • 这是一个很好的例子,说明为什么你使用英语来命名你的类、接口、变量等。我只了解两件事:你使用DateTime,它在某种程度上与Logins 相关.如果哈萨克语“kitap”与土耳其语“kitap”相同,它也与书籍有某种关系:)
  • 请阅读how to ask,以便您以后提高问题的质量。
  • 至于你们在这里评论的其他人,关于没有错误的盐(看着你@J.Steen)和关于命名约定的讨论几乎不相关。诚然,如果名称对我们来说是描述性的,它会帮助我们帮助 OP,但它们不是导致问题的原因。如果尽管存在语言障碍,我们仍无法辨别代码在做什么并协助 OP,那么我们不应该首先解决这个问题。
  • @Ortund 我已经直接编辑了盐。这是对每天涌入大量低质量问题所带来的挫败感的发泄。但是,公平点,并被接受。

标签: c# entity-framework linq


【解决方案1】:

在您的更新声明中:

var updatebook = db.k_Books.Where(w => w.ID ==a).FirstOrDefault();
updatebook.Kitap_statusId = 2;
db.SaveChanges();

您正在使用FirstOrDefault 选择Id == a 的记录,并且鉴于EntityFramework 无法更新此记录,我将假设Id == a 不存在任何记录,因此您需要处理空返回查询中的值:

var updatebook = db.k_Books.FirstOrDefault(w => w.ID == a);

if (updatebook != null)
{
    updatebook.Kitap_statusId = 2;
    db.SaveChanges();
}

在这种情况下,如果查询返回了一条记录,它将更新Kitap_statusId,否则,它不会做任何事情。

更新

根据 OP 对此问题的评论:

我解决了问题,但是现在我需要找到当我在一个表中插入新数据时,其他表插入到同一个表中,我该怎么做

您只需要获取新插入实体的 Id 值并使用它将记录插入到第二个表中。

所以在您的代码中,您插入了第一项:

db.k_Rentedbooks.Add(rent);

当您为此执行 SaveChanges() 时,它会自动使用其新 ID 更新实体,因此在该函数的下方,您可以使用 rent 的 Id 值向第二个表添加新记录.

举个粗略的例子:

var Book = new Book{ statusId = rent.Id };
db.SecondTable.Add(Book);
db.SaveChanges();

【讨论】:

  • 从数据网格视图内容中取值
  • 请更新您的问题并包括数据网格视图代码和数据示例(尝试将其转换为英文,以便人们更容易理解 - 这将使我们更容易为您提供帮助)。
  • @FahriBilici 请同时包含您在尝试SaveChanges()时收到的错误消息
  • @Orttund 有什么帮助吗?
  • @FahriBilici 需要更多信息。我可以告诉您的是,您正在更改由另一个表引用的列中的数据,而 SQL Server 不允许您这样做。请显示此表的关系
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多