Как обновить только измененные поля из моей таблицы KendoUI в моем основном приложении ASP.NET? - PullRequest
0 голосов
/ 07 ноября 2019

В моем приложении ASP.NET Core я использую KendoUI от Progress. В частности, я использую сетку, которая позволяет выполнять базовые операции с вашими данными. Я использую шаблон репозитория для своих операций CRUD и представлений SQL.

Проблема

Проблема, с которой я сталкиваюсь, заключается в том, что при обновлении строки сетки объект «представление» передается вконтроллер. Затем я пытаюсь разделить эту сущность, чтобы обновить две связанные таблицы (см. Ниже метод обновления для примера этого), что означает, что из-за жестких определений типов любые обновленные записи будут также иметь значения 'null'.

Почему существует эта проблема?

Из того, что я вижу, мой подход неверен, он выходит из шаблона хранилища, а затем определяет «Сосуд» и «Положение» и явно указывает их значения. нарушая интеллект «Обновления» EntityFrame по отношению к «Контексту», и он не может / не будет обновлять только те поля, которые были отредактированы. Если бы это было обновление одной записи, за которое отвечал только один класс сущностей, хранилище работало бы нормально, и обновлялись бы только отредактированные поля.

Мой вопрос заключается в том, что я могу сделать, чтобы мой подход стал лучше, а также толькообновить те поля, которые были обновлены в сетке, при этом сообщая моему коду об обновлении обеих таблиц?

Некоторые люди могут предложить Automapper или что-то подобное, но я бы предпочел по возможности избегать этого плагина.

Настройка

Мой помощник по тегу KendoUI Grid читает данные из моего контроллера, этот контроллер обращается к моему репозиторию через мои внедренные сервисы, мой репозиторий использует класс сущности, который оформлен объявлением «Table», которое смотрит наSQL View в моей базе данных. Цель этого представления - объединить несколько таблиц и показать определенный набор данных. Это альтернатива, которую я предпочитаю вместо использования LINQ для создания множества соединений в моих контроллерах.

Home.chtml

Это сетка, созданная с помощью помощников тегов. Можно видеть, что методы чтения и обновления определены в транспортном модуле и их относительный путь к методам в контроллере.

<kendo-grid name="positions" deferred="true">
    <datasource type="DataSourceTagHelperType.Ajax" page-size="100">
        <transport>
            <read url="/Home/ReadPositions" />
            <update url="/Home/EditPosition" />
        </transport>
        <schema>
            <model id="Id">
                <fields>
                    <field name="Id" editable="false"></field>
                    <field name="Name"></field>
                </fields>
            </model>
        </schema>
    </datasource>
    <editable mode="popup" />
    <groupable enabled="true" />
    <sortable enabled="true" />
    <filterable enabled="true" />
    <columns>
        <column field="Id" title="Id" width="100" />
        <column field="Name" title="Name" />
        <column field="IMO" title="IMO" />
        <column field="Prompt" title="Prompt"  />
        <column field="Sublet" title="Sublet" />
        <column field="Region" title="Region" />
        <column>
            <commands>
                <column-command text="Edit" name="edit"></column-command>
                <column-command text="Delete" name="destroy"></column-command>
            </commands>
        </column>
    </columns>
</kendo-grid>

HomeController.cs

Это контроллер, который приведен вышеСетка читает из. Использование кендо «DataSourceRequest». Как вы увидите из имен службы репозитория, она использует службу, которая специально читает из представления SQL.

public IActionResult ReadPositions([DataSourceRequest]DataSourceRequest request)
{
    var data = _viewPositionService.GetViewPositions();
    var result = data.ToDataSourceResult(request);
    return Json(result);
}

Этот метод, хотя функционал некорректен для возникшей у меня проблемы.

[HttpPost]
public IActionResult EditPosition([DataSourceRequest] DataSourceRequest request, ViewPosition position)
{
    if (position != null && ModelState.IsValid)
    {
        //Update Vessel
        _vesselService.UpdateVessel(new Vessel
        {
            Id = position.Id,
            Name = position.Name,
            IMO = position.IMO
        });
        //Update Position
        _positionService.UpdatePosition(new Position
        {
            Id = position.PositionId,
            Prompt = position.Prompt,
            Sublet = position.Sublet,
            Region = position.Region
        });
    }
    return Json(new[] { position }.ToDataSourceResult(request, ModelState));
}

Repository.cs

Это метод обновления из моего репозитория.

public void Update(TEntity entity)
{
    if (entity == null)
    {
        throw new ArgumentNullException("entity");
    }
    _dbContext.Update(entity);
    _dbContext.SaveChanges();
}

Любая помощь или руководство приветствуется.

...