为什么我的 KendoUI 网格在我的 ASP.NET 核心应用程序中显示重复记录?
Why is my KendoUI Grid showing duplicate records in my ASP.NET Core application?
我在 ASP.NET 核心应用程序中使用 KendoUI 网格,当我 return 数据到我的网格时,它显示相同的记录两次。网格从我的存储库获取数据,带注释的实体查找名为 ViewVesselCrane
的视图。它应该 return 行数据与名为 VesselId
的特定 ID 匹配,但它似乎做的是 return 正确数量的结果,但它们都是相同的数据。
首先,这是我的观点:
ViewVesselCrane.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MyCompany.Data.Views
{
[Table("ViewVesselCrane")]
public class ViewVesselCrane
{
[Key]
public int DeckEquipmentId { get; set; }
public int? VesselId { get; set; }
public int? CraneTypeId { get; set; }
public int? NumberOfCranes { get; set; }
public string TypeName { get; set; }
public int? SWL { get; set; }
}
}
Services/CraneViewService.cs
using MyCompany.Data.Views;
using MyCompany.Repo;
using System;
using System.Collections.Generic;
using System.Text;
namespace MyCompany.Services.Views
{
public class CraneViewService : ICraneViewService
{
private IRepository<ViewVesselCrane> viewCraneRepository;
public CraneViewService(IRepository<ViewVesselCrane> viewCraneRepository)
{
this.viewCraneRepository = viewCraneRepository;
}
public IEnumerable<ViewVesselCrane> GetCranes()
{
return viewCraneRepository.GetAll();
}
public ViewVesselCrane GetCrane(int id)
{
return viewCraneRepository.Get(id);
}
public void InsertCrane(ViewVesselCrane crane)
{
viewCraneRepository.Insert(crane);
}
public void UpdateCrane(ViewVesselCrane crane)
{
viewCraneRepository.Update(crane);
}
public void DeleteCrane(int id)
{
ViewVesselCrane crane = GetCrane(id);
viewCraneRepository.Remove(crane);
viewCraneRepository.SaveChanges();
}
}
}
Services/ICraneViewService.cs
using MyCompany.Data.Views;
using System;
using System.Collections.Generic;
using System.Text;
namespace MyCompany.Services.Views
{
public interface ICraneViewService
{
IEnumerable<ViewVesselCrane> GetCranes();
ViewVesselCrane GetCrane(int id);
void InsertCrane(ViewVesselCrane crane);
void UpdateCrane(ViewVesselCrane crane);
void DeleteCrane(int id);
}
}
使用 TagHelper 的网格代码是:
网格
<kendo-grid name="cranesGrid" height="250">
<datasource type="DataSourceTagHelperType.Ajax" page-size="80">
<transport>
<read url="@Url.Action("CraneRead", "Vessel")" />
</transport>
</datasource>
<columns>
<column field="DeckEquipmentId" title="Deck Equip. Id" />
<column field="VesselId" title="VesselId" />
<column field="TypeName" title="TypeName" />
<column field="NumberOfCranes" title="No. Cranes" />
<column field="CraneId" title="CraneId" />
</columns>
</kendo-grid>
Controllers/VesselController/GetCranes
请注意,我硬编码了一个 Id 只是为了测试目的,在生产中,Id 作为可选参数通过绑定到网格的 data
传输选项的 javascript 函数传递给控制器.
public ActionResult CraneRead([DataSourceRequest] DataSourceRequest request, int? id)
{
var data = _craneService.GetCranes().Where(x => x.VesselId == 21059);
var result = data.ToDataSourceResult(request);
return Json(result);
}
好的,这就是基本设置。现在对于视图,它非常基本,将三个表连接在一起。如果我 运行 视图并使用 SSMS 传入 VesselId
,我会看到预期的结果。如果我 运行 应用程序,我会看到正确数量的结果,但数据看起来一样,但不应该。
ViewVesselCrane
SELECT O.DeckEquipmentId, P.TypeName, I.SWL, I.NumberOfCranes, I.CraneTypeId, O.VesselId
FROM dbo.DeckEquipment AS O LEFT JOIN
dbo.Crane AS I ON O.DeckEquipmentId = I.DeckEquipmentId LEFT JOIN
dbo.CraneType AS P ON P.CraneTypeId = I.CraneTypeId
我不确定问题出在哪里,因为 SQL 查询在我测试时有效,我只能假设我在我的应用程序中做错了一些事情,我需要一些帮助找到它。
我对此进行了深入研究,发现问题出在视图本身,EF 试图理解我在实体中使用“[Key]”注释定义的唯一键,但它实际上并不是唯一的,因此重复项被翻了。我添加了一个额外的列(我不使用),它是唯一的,并对其应用了键注释,它现在可以工作了。
我在 ASP.NET 核心应用程序中使用 KendoUI 网格,当我 return 数据到我的网格时,它显示相同的记录两次。网格从我的存储库获取数据,带注释的实体查找名为 ViewVesselCrane
的视图。它应该 return 行数据与名为 VesselId
的特定 ID 匹配,但它似乎做的是 return 正确数量的结果,但它们都是相同的数据。
首先,这是我的观点:
ViewVesselCrane.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MyCompany.Data.Views
{
[Table("ViewVesselCrane")]
public class ViewVesselCrane
{
[Key]
public int DeckEquipmentId { get; set; }
public int? VesselId { get; set; }
public int? CraneTypeId { get; set; }
public int? NumberOfCranes { get; set; }
public string TypeName { get; set; }
public int? SWL { get; set; }
}
}
Services/CraneViewService.cs
using MyCompany.Data.Views;
using MyCompany.Repo;
using System;
using System.Collections.Generic;
using System.Text;
namespace MyCompany.Services.Views
{
public class CraneViewService : ICraneViewService
{
private IRepository<ViewVesselCrane> viewCraneRepository;
public CraneViewService(IRepository<ViewVesselCrane> viewCraneRepository)
{
this.viewCraneRepository = viewCraneRepository;
}
public IEnumerable<ViewVesselCrane> GetCranes()
{
return viewCraneRepository.GetAll();
}
public ViewVesselCrane GetCrane(int id)
{
return viewCraneRepository.Get(id);
}
public void InsertCrane(ViewVesselCrane crane)
{
viewCraneRepository.Insert(crane);
}
public void UpdateCrane(ViewVesselCrane crane)
{
viewCraneRepository.Update(crane);
}
public void DeleteCrane(int id)
{
ViewVesselCrane crane = GetCrane(id);
viewCraneRepository.Remove(crane);
viewCraneRepository.SaveChanges();
}
}
}
Services/ICraneViewService.cs
using MyCompany.Data.Views;
using System;
using System.Collections.Generic;
using System.Text;
namespace MyCompany.Services.Views
{
public interface ICraneViewService
{
IEnumerable<ViewVesselCrane> GetCranes();
ViewVesselCrane GetCrane(int id);
void InsertCrane(ViewVesselCrane crane);
void UpdateCrane(ViewVesselCrane crane);
void DeleteCrane(int id);
}
}
使用 TagHelper 的网格代码是:
网格
<kendo-grid name="cranesGrid" height="250">
<datasource type="DataSourceTagHelperType.Ajax" page-size="80">
<transport>
<read url="@Url.Action("CraneRead", "Vessel")" />
</transport>
</datasource>
<columns>
<column field="DeckEquipmentId" title="Deck Equip. Id" />
<column field="VesselId" title="VesselId" />
<column field="TypeName" title="TypeName" />
<column field="NumberOfCranes" title="No. Cranes" />
<column field="CraneId" title="CraneId" />
</columns>
</kendo-grid>
Controllers/VesselController/GetCranes
请注意,我硬编码了一个 Id 只是为了测试目的,在生产中,Id 作为可选参数通过绑定到网格的 data
传输选项的 javascript 函数传递给控制器.
public ActionResult CraneRead([DataSourceRequest] DataSourceRequest request, int? id)
{
var data = _craneService.GetCranes().Where(x => x.VesselId == 21059);
var result = data.ToDataSourceResult(request);
return Json(result);
}
好的,这就是基本设置。现在对于视图,它非常基本,将三个表连接在一起。如果我 运行 视图并使用 SSMS 传入 VesselId
,我会看到预期的结果。如果我 运行 应用程序,我会看到正确数量的结果,但数据看起来一样,但不应该。
ViewVesselCrane
SELECT O.DeckEquipmentId, P.TypeName, I.SWL, I.NumberOfCranes, I.CraneTypeId, O.VesselId
FROM dbo.DeckEquipment AS O LEFT JOIN
dbo.Crane AS I ON O.DeckEquipmentId = I.DeckEquipmentId LEFT JOIN
dbo.CraneType AS P ON P.CraneTypeId = I.CraneTypeId
我不确定问题出在哪里,因为 SQL 查询在我测试时有效,我只能假设我在我的应用程序中做错了一些事情,我需要一些帮助找到它。
我对此进行了深入研究,发现问题出在视图本身,EF 试图理解我在实体中使用“[Key]”注释定义的唯一键,但它实际上并不是唯一的,因此重复项被翻了。我添加了一个额外的列(我不使用),它是唯一的,并对其应用了键注释,它现在可以工作了。