Получение InvalidCastException в DbUpdateException при обновлении таблицы SQL Server - PullRequest
0 голосов
/ 07 февраля 2019

У нас есть веб-приложение администратора БД, которое создает, обновляет и удаляет записи в нашей базе данных 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)

1 Ответ

0 голосов
/ 07 февраля 2019

Что это за атрибут [DataTablesAttributeRowId]?Есть ли в вашей таблице столбец с именем «RowId»?Вы упоминаете каскадный (составной?) Ключ.Обычно, если это PK, состоящий из 2х столбцов, вы должны объявить отображение ключей:

[Key, Column(Order = 0)]
[Required] 
[StringLength(5)]
public string SELLING_STYLE_NBR { get; set; }
// ...
[Key, Column(Order = 1)]
[Required]
[StringLength(3)]
public string CUST_REFERENCE_NBR { get; set; }

В базе данных это оба столбца Varchar / NVarchar?Кажется необычным использование текстовых PK / FK в системе, где именование подразумевает, что они являются числовыми.

Объявления объектов должны отражать схему таблицы и отношения между таблицами.Чтобы помочь с оценкой картографических проблем, пожалуйста, включите соответствующую структуру таблицы.В вашем примере кода есть несколько запахов, включая этот атрибут, и различные соглашения об именах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...