我通过datagrid删除行事件成功从SQLite数据库中删除实体。这可以通过SQLite Manager确认。但是在运行此删除事件和 SaveChanges()命令后,我仍然在使用 GetLocal()方法后获取已删除的实体。
这里是deleteRow方法( Complete()调用SaveChanges()):
private void dld_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete && !_isBeingEdited)
{
var grid = (DataGrid)sender;
if (grid.SelectedItems.Count > 0)
{
var res = MessageBox.Show("Are you sure you want to delete " + grid.SelectedItems.Count + " devices?", "Deleting Records", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
if (res == MessageBoxResult.Yes)
{
foreach (var row in grid.SelectedItems)
{
Device device = row as Device;
_context.Devices.RemoveDevice(device);
}
_context.Complete();
MessageBox.Show(grid.SelectedItems.Count + " Devices have being deleted!");
}
else
DeviceListDataGrid.ItemsSource = _context.Devices.GetLocal();
}
}
}
下次加载实体时,我得到了正确的实体,但在运行 GetLocal()后,我收到了之前删除的实体?
装载:
_context.Devices.Load();
var devices = _context.Devices.GetLocal();
DeviceListDataGrid.ItemsSource = devices;
GetLocal方法返回所有以前删除的实体吗?
public ObservableCollection<TEntity> GetLocal()
{
Context.GetService<DbContext>();
var data = Context.ChangeTracker.Entries<TEntity>().Select(e => e.Entity);
var collection = new ObservableCollection<TEntity>(data);
collection.CollectionChanged += (s, e) =>
{
if (e.NewItems != null)
{
Context.AddRange(e.NewItems.Cast<TEntity>());
}
if (e.OldItems != null)
{
Context.RemoveRange(e.OldItems.Cast<TEntity>());
}
};
return collection;
}
由于某种原因,行var data = Context.ChangeTracker.Entries<TEntity>().Select(e => e.Entity);
在删除之前仍会返回旧实体吗?
这是设备数据库表:
CREATE TABLE "Device" (
"DeviceId" INTEGER NOT NULL CONSTRAINT "PK_Device" PRIMARY KEY AUTOINCREMENT,
"AdditionalInformation" TEXT,
"Ampere" REAL,
"Category" TEXT,
"Category1CategoryId" INTEGER,
"Description" TEXT,
"DocumentIdentifier" TEXT,
"GrossPrice" REAL,
"HasErrors" INTEGER NOT NULL,
"IsValid" INTEGER NOT NULL,
"LeafletPath" TEXT,
"Location" TEXT,
"Name" TEXT,
"NetPrice" REAL,
"Notes" TEXT,
"ProductCode" INTEGER NOT NULL,
"ProductType" TEXT,
"ProductType1ProductTypeId" INTEGER,
"Supplier" TEXT,
"Supplier1SupplierId" INTEGER,
"TechData" TEXT,
"TimeCreated" TEXT NOT NULL,
"UseDefaultValuesFlag" INTEGER,
"Watt" REAL,
CONSTRAINT "FK_Device_Category_Category1CategoryId" FOREIGN KEY ("Category1CategoryId") REFERENCES "Category" ("CategoryId") ON DELETE RESTRICT,
CONSTRAINT "FK_Device_ProductType_ProductType1ProductTypeId" FOREIGN KEY ("ProductType1ProductTypeId") REFERENCES "ProductType" ("ProductTypeId") ON DELETE RESTRICT,
CONSTRAINT "FK_Device_Supplier_Supplier1SupplierId" FOREIGN KEY ("Supplier1SupplierId") REFERENCES "Supplier" ("SupplierId") ON DELETE RESTRICT
)
答案 0 :(得分:1)
ChangeTracker目前持有代表已删除实体的条目。这是针对更改跟踪器中的某些边缘情况而刻意完成的,尽管在将来更新到EF时可能会更改。
您可以通过过滤列表来避免选择删除实体的更改跟踪器条目。
Context
.ChangeTracker
.Entries<TEntity>()
.Where(e => e.State != EntityState.Detached)
.Select(e => e.Entity);