gpt4 book ai didi

c# - 为什么 SaveChanges() 只保存现有行的修改,而不是删除或添加的条目?

转载 作者:行者123 更新时间:2023-11-30 22:10:02 25 4
gpt4 key购买 nike

使用; c#、.net 4.5 与 2012 winforms

尝试使用 EntityFramework 将一些新数据保存到已经绑定(bind)到 dataGridview 的数据库。

要在 dataGridView 中显示来自数据库的数据,请使用以下代码:

对于所有方法的使用

LibraryLib.LibraryEntities context = new LibraryLib.LibraryEntities();

在一种方法中我称之为:

BindingSource bs = new BindingSource();
bs.DataSource = typeof(LibraryLib.Book);
context.Book.ToList().ForEach(n => bs.Add(n));
dataGridViewDB.DataSource = bs;

BindingSource bstab2 = new BindingSource();
bstab2.DataSource = typeof(LibraryLib.LibraryStock);
context.LibraryStock.ToList().ForEach(n => bstab2.Add(n));
dataGridViewCategoryDB.DataSource = bstab2;

在另一种方法中使用下一个代码来保存数据(更改后按下按钮调用):

context.SaveChanges();
context.Dispose();

我的数据库图表

enter image description here

结果 -

我可以在 dataGridview 中看到我所有的数据库条目。

我可以更改任何单元格,如果保存 - 全部保存。但是,如果我添加新项目或删除现有项目(在两个表中 - 意味着从两个表中删除相关条目),此更改未保存?输入数据时,所有必需的数据格式(平均 varchar 或 int)- 好的。

正如我所读 - 我可以将数据绑定(bind)到 datagridView,然后修改它,添加或删除任何条目,然后使用 ObjectSet saveChanges() 中的方法保存它?我说得对吗?

问题 为什么我在保存更新(添加或删除)数据时遇到问题以及我哪里错了?


编辑

非常感谢您对 potehin143 的帮助

我用另一种方法解决了这个问题——创建一些方法来从 DatdBase 添加和删除条目

由于我的程序设计 View ,我尝试对所有类型的引擎使用通用逻辑(意思是添加、删除、更新库中的条目等功能)

enter image description here

接下来添加代码:

public void AddNewBookEF()
{
string id = Guid.NewGuid().ToString();
LibraryLib.LibraryStock newCat = new LibraryLib.LibraryStock();
newCat.ID = id;
newCat.Category = listBoxShelfDB.Text;
context.LibraryStock.Add(newCat);

LibraryLib.Book newBook = new LibraryLib.Book();
newBook.ID = id;
newBook.Author = textBoxAuthorDB.Text;
newBook.Name = textBoxNameDB.Text;
newBook.Year = Int32.Parse(numericUpDownYearDB.Value.ToString());
newBook.Genre = textBoxGenreDB.Text;
context.Book.Add(newBook);
context.SaveChanges();
}

要从数据库中删除条目,请准备如下代码:

public void RemoveFromDBEF(string bookId)
{
if (dataGridViewDB.SelectedRows.Count == 1)
{
LibraryLib.Book bookToDelete = new LibraryLib.Book();
bookToDelete.ID = bookId;

foreach (LibraryLib.Book entry in context.Book)
{
if (entry.ID == bookId)
context.Book.Remove(entry);
}
foreach (LibraryLib.LibraryStock entry in context.LibraryStock)
{
if (entry.ID == bookId)
context.LibraryStock.Remove(entry);
}
context.SaveChanges();
}
else
{
MessageBox.Show("Please select only one row for deleting in Book table");
}
}

bookId - Guid 标识符,以字符串形式转换并保存到数据库(当我开始准备程序时,我不知道数据库中现有的 Guid 类型,因此请不要重写该程序的所有代码,我只是现在在读)。要在 DataGridView 中查找所选书籍的 bookId,请使用如下代码:

    private string GetGuidAsString()
{
try
{
...
if (this.tabControlEngines.SelectedIndex == 2)
{
//get selected number of cell
int index = dataGridViewDB.SelectedCells[0].RowIndex;
//get selected row
DataGridViewRow selectedBook = dataGridViewDB.Rows[index];
string guidOfBook = Convert.ToString(selectedBook.Cells[0].Value);
return guidOfBook;
}
}
catch (ArgumentOutOfRangeException)
{
MessageBox.Show("Please select a book or add books to empty lib", "No book selected");
return null;
}
catch (Exception) { }
return null;
}

也许这个答案对某些人有帮助。

最佳答案

你有两个不同的地方存储对数据项的引用 上下文和绑定(bind)源

所以如果你添加一些东西到绑定(bind)源你需要添加相同的项目到上下文与删除相同

如果您只是通过 DataGridView 将项目添加到 bindingsorce,您的上下文并不知道它

试试看

// Here is Example for Book Entity


context.Book.ToList().ForEach(n => bs.Add(n));
// attach event after fill data
bs.ListChanged += bs_ListChanged;


void bs_ListChanged(object sender, ListChangedEventArgs e)
{
switch (e.ListChangedType)
{
case ListChangedType.ItemAdded:
context.Book.Add((Book)((BindingSource)sender).List[e.NewIndex]); // Adding to Navigating Collection
break;

case ListChangedType.ItemDeleted:
contextBook.Remove((Book)((BindingSource)sender).List[e.OldIndex]);
break;
}

}


//detaching events for reloading data
bs.ListChanged -= bs_ListChanged;
// here reloading data from dbase
bs.ListChanged += bs_ListChanged;

实体之间的关系看起来是一对一的,所以你可能需要另一种方式通过像这样加入类来添加和删除两个实体的数据

public class JoinClass
{
private Book _Book;
private LibraryStock _LibraryStock;
public Book GetBook() { return _Book; }
public LibraryStock GetLibraryStock() { return _LibraryStock; }

public JoinClass()
{
_LibraryStock = new LibraryStock();
_Book = new Book();
_LibraryStock.Book = _Book;
}
public JoinClass(LibraryStock libraryStock)
{
_LibraryStock = libraryStock;
_Book = libraryStock.Book;
}

// here properties of both entities

}

然后您可以使用一个 BindingSorce 和一个事件处理程序

关于c# - 为什么 SaveChanges() 只保存现有行的修改,而不是删除或添加的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21121971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com