В моем приложении 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();
}
Любая помощь или руководство приветствуется.