У нас есть веб-приложение администратора БД, которое создает, обновляет и удаляет записи в нашей базе данных SQL Server.Построенное на ASP.NET MVC и использующее Entity Framework 2.2, приложение успешно работает при создании и обновлении почти всех таблиц в базе данных.Тем не менее, я испытываю исключение обновления базы данных при обновлении конкретной таблицы.Внутренним исключением является исключение
Invalid Cast: "Невозможно привести объект типа 'System.String' к типу 'System.Int32'
Модель этогоТаблица была создана с помощью EF Core Power Tools для включения всех столбцов в эту таблицу. Я могу без проблем создавать новые записи в таблице, но когда я использую приложение для обновления ЛЮБОГО значения, я получаю исключение.представление для создания и представление для редактирования. В этой таблице проблем имеется около 50 столбцов с объединенным основным, который включает в себя 2 столбца и 1 столбец без значения NULLS.
Я могу СОЗДАТЬ записьс небольшими или всеми значениями, заполненными без проблем. Я могу редактировать запись без внесения изменений. Но всякий раз, когда я делаю изменения в любом поле, я получаю сообщение об ошибке.
Я пытался удалить поля, чтобы попытаться сузитьвниз, если это конкретный, но это было бесполезно. Я трижды проверил, что типы данных свойств в строке класса моделис типами данных таблицы.Все правильно ... кроме того, если бы не было, то я получал бы ту же ошибку при создании.
Вот мой усеченный класс модели:
public partial class SC_CUSTOM_STYLE_SPEC
{
[DataTablesAttributeRowId]
public string RowId { get { return String.Format("{0}_{1}", SELLING_STYLE_NBR, CUST_REFERENCE_NBR); } }
[Required]
[StringLength(5)]
public string SELLING_STYLE_NBR { get; set; }
[StringLength(2)]
public string selling_company { get; set; }
public string density { get; set; }
[StringLength(100)]
public string construction_type { get; set; }
[StringLength(50)]
public string electrstatic_propensity { get; set; }
[StringLength(100)]
public string protective_treatments { get; set; }
[StringLength(50)]
public string smoke_density { get; set; }
[StringLength(50)]
public string long_name { get; set; }
public int? introduction_date { get; set; }
public string stitches_per_inch { get; set; }
[Required]
[StringLength(3)]
public string CUST_REFERENCE_NBR { get; set; }
[StringLength(50)]
public string greige_good_nbr { get; set; }
[StringLength(50)]
public string inventory_style_nbr { get; set; }
public bool? is18x36 { get; set; }
public bool? isHex { get; set; }
public bool? enableViz { get; set; }
public bool? enableCustomViz { get; set; }
public bool? enableGenericViz { get; set; }
public bool? is9x36Tile { get; set; }
public bool? isFacetTile { get; set; }
public int? product_subtype_id { get; set; }
...
Вот мой Create
метод в моем контроллере:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("SELLING_STYLE_NBR,selling_company,...")] SC_CUSTOM_STYLE_SPEC sC_CUSTOM_STYLE_SPEC)
{
if (ModelState.IsValid)
{
_context.Add(sC_CUSTOM_STYLE_SPEC);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(sC_CUSTOM_STYLE_SPEC);
}
Вот мой Edit
метод:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, [Bind("SELLING_STYLE_NBR,selling_company,...")] SC_CUSTOM_STYLE_SPEC sC_CUSTOM_STYLE_SPEC)
{
if (ModelState.IsValid)
{
try
{
_context.Update(sC_CUSTOM_STYLE_SPEC);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException ex)
{
if (!SC_CUSTOM_STYLE_SPECExists(sC_CUSTOM_STYLE_SPEC.SELLING_STYLE_NBR))
{
return NotFound();
}
else
{
throw;
}
}
catch (DbUpdateException ex)
{
var exception = HandleDbException(ex);
return View("Error", new System.Web.Mvc.HandleErrorInfo(exception,"SC_CUSTOM_STYLE_SPEC","Edit"));
}
// redirect back to List page if referrer is available (only for models with FK)
var referrer = Request.Form["Referrer"];
if (String.IsNullOrEmpty(referrer))
return RedirectToAction(nameof(Index));
else
return Redirect(referrer);
}
return View(sC_CUSTOM_STYLE_SPEC);
}
Вот стек:
Microsoft.EntityFrameworkCore.DbUpdateException: произошла ошибка при обновлении записей.Смотрите внутреннее исключение для деталей.---> System.InvalidCastException: невозможно преобразовать объект типа 'System.String' в тип 'System.Int32'.
в System.Data.SqlClient.SqlBuffer.get_Int32 ()
at System.Data.SqlClient.SqlDataReader.GetInt32 (Int32 i)
в Microsoft.EntityFrameworkCore.Update.ActedCountModificationCommandBatch.ConsumeResultSetWithoutPropagationAsync * читатель для пересылки данных через интерфейс Intate, Relayation Relay, Relay, Relay, Relay, Relay, Relay, Relay, Relay, Relay, RelayingEntityFrameworkCore.Update.ActedCountModificationCommandBatch.ConsumeAsync (читатель RelationalDataReader, CancellationToken cancellationToken)
--- конец трассировки стека внутренних исключений ---
в CPSDataAdmin.Controllers.SCLECIDESTC_SC_C_D_COM_CLE_COMTOR_ST_CLECER_STSC_CUSTOM_STYLE_SPEC sC_CUSTOM_STYLE_SPEC) в C: \ Projects \ cps-data-admin \ CPSDataAdmin \ Controllers \ SC_CUSTOM_STYLE_SPECController.cs: строка 379
в Microsoft.AspNetCore.Mvc.Inex.Exec.Exceptionecute (преобразователь IActionResultTypeMapper, исполнитель ObjectMethodExecutor, контроллер объекта, аргументы Object [])
в System.Threading.Tasks.ValueTask`1.get_Result ()
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync ()
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync ()
в контексте Microsoft.AspNetCore.*
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted)
в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvoynInnerF)1053 *
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (контекст ResourceExecutedContext)
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (Состояние и следующее, Область и область действия, Объект и состояние, логическое значение и isCompleted)
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAs61c ()*
в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
в Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext)
в Microsoft.AspNetCore..AuthenticationMiddleware.Invoke (контекст HttpContext)
в Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (контекст HttpContext)
в Microsoft.AspNetCore.Diagnostics.
в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext)
в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseExtware.Inteware.TeventInTextInfoв Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)