.net mvc 返回重复记录

.net mvc returning duplicate records

我有一个 ajax/json 调用返回 正确的记录数 ,但它们都是同一条记录,第一条记录。

SQL 查看:

ALTER view [dbo].[v_EMS_BM_Organization_Detail] as
select a.OrgID
,   a.Organization
,   a.inactive
,   b.buID
,   b.BusinessUnit
,   count(distinct c.Budget) Budgets
,   count(distinct d.BEMS) People
from t_EMS_BM_Organization a
left join t_EMS_BM_Business_Unit b
on a.OrgID = b.OrgID
left join t_EMS_BM_Budget c
on b.buID = c.buID
left join t_EMS_BM_Person d
on c.Budget = d.Budget
group by a.OrgID
,   a.Organization
,   a.inactive
,   b.buID
,   b.BusinessUnit
GO 

在SQL服务器中查询时:

select *
from v_EMS_BM_Organization_Detail
where OrgID= 6

Returns:

OrgID   Organization    inactive    buID    BusinessUnit    Budgets People
6       E3001       0       27      Manufacturing Services Staff    1   5
6       E3001       0       43      BASN    1   0
6       E3001       0       45      Special Assignment  1   0

我的模特:

namespace EMSBM.Models
{
    using System;
    using System.Collections.Generic;

    public partial class v_EMS_BM_Organization_Detail
    {
        public int OrgID { get; set; }
        public string Organization { get; set; }
        public Nullable<bool> inactive { get; set; }
        public Nullable<int> buID { get; set; }
        public string BusinessUnit { get; set; }
        public Nullable<int> Budgets { get; set; }
        public Nullable<int> People { get; set; }
    }
}

我的控制器:

[HttpPost]
public JsonResult OrgDetails(int ID)
{
    List<v_EMS_BM_Organization_Detail> orgDetail = new List<v_EMS_BM_Organization_Detail>();

    orgDetail = db.v_EMS_BM_Organization_Detail.Where(x => x.OrgID == ID).OrderBy(x => x.BusinessUnit).ToList();

    return this.Json(new
    {
        Result = (from obj in orgDetail
                  select new
                  {
                      OrgID = obj.OrgID
                      ,
                      Organization = obj.Organization
                      ,
                      inactive = obj.inactive
                      ,
                      buID = obj.buID
                      ,
                      BusinessUnit = obj.BusinessUnit
                      ,
                      Budgets = obj.Budgets
                      ,
                      People = obj.People
                  })
    });
}

我的Ajax/Json电话:

$('#organization-table-body').delegate('tr', 'click', function () {
    var OrgID = $(this).attr('id');
    OrgID = OrgID.substr(2, OrgID.length);

    $.ajax({
        type: 'post',
        url: '/OrganizationDetail/OrgDetails',
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({ ID: OrgID }),
        success: function (data) {
            $('#org-detail-body').empty();
            var html = '';
            $.each(data['Result'], function (i, item) {
                if (i == 0) {
                    $('#org-name').html(item.Organization +' Details');
                    $('#OrgID').val(OrgID);

                    $('#btn-active-status').removeClass('btn-primary');
                    $('#btn-active-status').removeClass('btn-danger');
                    if (item.inactive == true) {
                        $('#btn-active-status').html('Activate Organization');
                        $('#btn-active-status').addClass('btn-primary');
                    } else {
                        $('#btn-active-status').html('Deactivate Organization');
                        $('#btn-active-status').addClass('btn-danger');
                    }
                }
                html += '<tr id="tr' + item.buID + '" class="cursor-pointer"><td>' + item.BusinessUnit + '</td>';
                html += '<td>' + item.Budgets + '</td><td>' + item.People + '</td></tr>';
            });
            $('#org-detail-body').html(html);
            $('#org-detail-div').modal('show');
        },
        error: function (ex) {
            alert(ex.responseText);
        }
    });

在上面的 sql 服务器查询中传递 6 时,我得到了三个记录,这是正确的。但是三个记录都只是第一条记录:

Business Unit   Budgets     People
BASN            1           0
BASN            1           0
BASN            1           0

在 VS 2012 中调试时,无论我传递什么 ID,我都只会将第一条记录复制正确 X 次。

此问题与您的视图缺少主键有关。 EF 尝试用于唯一标识行的方法失败。

看起来您正在使用数据库优先并且模型 class 是生成的代码?如果是这样,请在模型浏览器中查看它。 EF 会猜到(通常非常糟糕)应该使用哪些列来构建主键。如果知道它们不能是 NULL,它会在键中包含列,如果不确定,则会排除列。

如果您愿意,可以使用 ROW_NUMBER() 为 table 创建代理键,或者您可以使用现有列。无论哪种方式,要向 EF 提供有关它在键中包含哪些列的提示,您应该将列包装在 ISNULL()(强制包含)或 NULLIF()(强制排除)中。

这里提供了关于这一切的教程:http://girlfromoutofthisworld.com/entity-framework-and-setting-primary-keys-on-views/