2016-02-26 78 views
0

我正在通過datagrid刪除行事件從SQLite數據庫成功刪除實體。這可以由SQLite Manager確認。然而,在運行這個刪除事件並且使用GetLocal()方法後,我仍然獲得了刪除的實體。實體框架ChangeTracker未更新,返回「已刪除」實體

這裏的deleteRow方法即可(完成()調用的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 
) 

回答

1

ChangeTracker目前持有上表示刪除實體條目。這是針對變更跟蹤器中的某些邊緣案例進行的,儘管在將來對EF進行更新時可能會對此進行更改。

您可以通過過濾列表來避免選擇刪除實體的更改跟蹤器條目。

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