vendredi 26 février 2016

Entity Framework ChangeTracker not updated, returns "deleted" entities

I'm successfully deleting entity from SQLite database by datagrid delete row event. This can be confirmed by SQLite Manager. However after running this delete event and SaveChanges() command I still get the deleted entities after using GetLocal() method.

Here's the deleteRow method:

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

Next time when loading the entities I get the correct entities, but after running GetLocal() I receive the previously deleted entities?

Loading:

    _context.Devices.Load();
    var devices = _context.Devices.GetLocal();
    DeviceListDataGrid.ItemsSource = devices;

GetLocal method returns all the previously deleted entities?

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

For some reason the line var data = Context.ChangeTracker.Entries<TEntity>().Select(e => e.Entity); still returns the old entities prior deletion?

Here's the device database table:

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
)

Aucun commentaire:

Enregistrer un commentaire