实体框架更改跟踪器未更新,返回“已删除”实体

本文关键字:实体 返回 删除 已删除 更新 框架 跟踪 | 更新日期: 2023-09-27 18:36:33

我正在通过数据网格删除行事件成功从SQLite数据库中删除实体。这可以通过SQLite管理器确认。但是,在运行此删除事件和 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
)

实体框架更改跟踪器未更新,返回“已删除”实体

ChangeTracker 当前保留表示已删除实体的条目。这是针对更改跟踪器中的某些边缘情况故意完成的,尽管这可能会在将来的 EF 更新中进行更改。

您可以通过筛选列表来避免选择删除实体的反向更改跟踪器条目。

Context
    .ChangeTracker
    .Entries<TEntity>()
    .Where(e => e.State != EntityState.Detached)
    .Select(e => e.Entity);