在我的ASP.NET Core应用程序中,我使用的是来自Progress的KendoUI。特别是,我使用的网格允许对数据进行基本的操作。我正在为CRUD操作和SQL视图使用存储库模式。
问题
我遇到的问题是,当我更新网格行时,“视图”实体被传递到控制器中。然后,我尝试拆分该实体以更新两个相关表(有关此示例,请参见下面的更新方法),这意味着,由于硬类型定义,任何更新的记录也将具有提交的'null'值。
为什么存在此问题?
从我所看到的是,我的方法是错误的,退出存储库模式,然后定义“ Vessel”和“ Position”,并明确指定它们的值,这打破了EntityFrame的“ Update”对“ Context”的智能”,它不能/不会仅更新那些已编辑的字段。如果这是一次只有一个实体类负责的单项更新,则存储库将正常工作,并且仅更新已编辑的字段。
我的问题是我该怎么做才能使我的方法更好,并且只更新那些已经在网格中更新的字段,同时告诉我的代码更新两个表?
有些人可能会建议使用Automapper或类似的东西,但如果可能的话,我宁愿避免使用该插件。
设置
我的KendoUI标签帮助器网格从我的控制器读取数据,该控制器通过我注入的服务访问我的存储库,我的存储库使用一个实体类,该实体类装饰有“表”声明,该声明查看数据库中的SQL视图。该视图的目的是将多个表连接在一起并显示一组特定的数据。我更喜欢这种替代方法,而不是使用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();
}
感谢任何帮助或指导。