public async Task <IActionResult> DeleteEntity([FromRoute] string dbSetName, [FromRoute] string id) { var viewModel = new DataDeleteViewModel(); viewModel.DbSetName = dbSetName; viewModel.Id = id; viewModel.Object = GetEntityFromDbSet(dbSetName, id, out var dbContext, out var entityType); if (viewModel.Object == null) { return(NotFound()); } return(View(viewModel)); }
public async Task <IActionResult> DeleteEntityPost([FromForm] DataDeleteViewModel viewModel) { foreach (var dbContext in dbContexts) { foreach (var dbSetProperty in dbContext.Type.GetProperties()) { if (dbSetProperty.PropertyType.IsGenericType && dbSetProperty.PropertyType.Name.StartsWith("DbSet") && dbSetProperty.Name.ToLowerInvariant() == viewModel.DbSetName.ToLowerInvariant()) { var dbContextObject = (DbContext)this.HttpContext.RequestServices.GetRequiredService(dbContext.Type); var dbSetValue = dbSetProperty.GetValue(dbContextObject); var primaryKey = dbContextObject.Model.FindEntityType(dbSetProperty.PropertyType.GetGenericArguments()[0]).FindPrimaryKey(); var clrType = primaryKey.Properties[0].ClrType; object convertedPrimaryKey = viewModel.Id; if (clrType == typeof(Guid)) { convertedPrimaryKey = Guid.Parse(viewModel.Id); } else if (clrType == typeof(int)) { convertedPrimaryKey = int.Parse(viewModel.Id); } else if (clrType == typeof(Int64)) { convertedPrimaryKey = Int64.Parse(viewModel.Id); } var entityToDelete = dbSetValue.GetType().InvokeMember("Find", BindingFlags.InvokeMethod, null, dbSetValue, args: new object[] { convertedPrimaryKey }); dbSetValue.GetType().InvokeMember("Remove", BindingFlags.InvokeMethod, null, dbSetValue, args: new object[] { entityToDelete }); await dbContextObject.SaveChangesAsync(); } } } return(RedirectToAction("Index", new { Id = viewModel.DbSetName })); }