C# DataContext似乎正在从数据库中提取同一记录的两个副本

C# DataContext似乎正在从数据库中提取同一记录的两个副本,c#,linq,linq-to-sql,datacontext,C#,Linq,Linq To Sql,Datacontext,我有一个DataContext,它似乎在从数据库中取出同一记录的两个副本。数据库中只有一条这样的记录 下面是执行此操作的代码: dataAccessContext = new DataAccessDataContext("Data Source=" + SettingsManager.OpsMgrSettings.DBDIR + ";default lock tim

我有一个DataContext,它似乎在从数据库中取出同一记录的两个副本。数据库中只有一条这样的记录

下面是执行此操作的代码:

dataAccessContext =
                    new DataAccessDataContext("Data Source=" + SettingsManager.OpsMgrSettings.DBDIR +
                                              ";default lock timeout=10000");
调用上述函数后,当我调试dataAccessContext时,我会看到一个名为JobNumbers的实体。在该实体内部,还有另一个名为SafetyIssues的实体,它有2条记录,而不是1条。它们是完全相同的记录。数据库只显示一条记录,但显示了它如何在dataAccessContext中两次提取同一条记录

即使稍后绑定到列表框,它也会在列表框中显示相同的记录两次。如果我单击一个,它们都会被选中

以下是JobNumbers实体的dbml设计(如果有帮助):


这里是SateyIssues实体的dbml(如果有帮助):


我编写的dbml部分类代码:

    partial class SafetyIssue
    {

        partial void OnLoaded()
        {
            JobNumber.CalculateSafetyIssueTotals();  
        }

    }

    partial class SafetyIssueTotals
    {
       public void RefreshTotals(List<SafetyIssue> safetyIssues)
       {
           TotalSubmissions = safetyIssues.Count(c => c.SafetyCategory == 1);
           TotalInductions = safetyIssues.Count(c => c.SafetyCategory == 2);
           TotalSafetyMeetings = safetyIssues.Count(c => c.SafetyCategory == 3); 
           TotalToolboxTalk = safetyIssues.Count(c => c.SafetyCategory == 4);
           TotalRecognitions = safetyIssues.Count(c => c.SafetyCategory == 5);
           TotalIncidents = safetyIssues.Count(c => c.SafetyCategory == 6);
           ActualSafetySubmissions = safetyIssues.Count(c => c.JobSafetyNo.Trim() != "");
       }

    }


    partial class JobNumber:IDataErrorInfo
    {

        public void CalculateSafetyIssueTotals()
        {
            if (SafetyIssuesTotals == null)
                SafetyIssuesTotals = new SafetyIssuesTotals();

/* If I comment the part below out, it works.  Seems like if I use the SafetyIssues entity at all (in this case SafetyIssues.Count() to  assign things, the problem happens */

            SafetyIssuesTotals.TotalActualSafetySubmissions = SafetyIssues.Count;
            SafetyIssuesTotals.TotalIncidents =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 6);
            SafetyIssuesTotals.TotalInductions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 2);
            SafetyIssuesTotals.TotalRecognitions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 5);
            SafetyIssuesTotals.TotalSafetyMeetings =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 3);
            SafetyIssuesTotals.TotalSubmissions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 1);
            SafetyIssuesTotals.TotalToolboxTalk =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 4);

    //////////////////////////////////////////////////////////////////////////////////////
        }

        public bool NoReportedSafetyIssues
        {
            get
            {
                _noReportedSafetyIssues = SafetyIssues.Count == 0;
                return _noReportedSafetyIssues;
            }
            set
            {
                _noReportedSafetyIssues = value;
                SendPropertyChanged("NoReportedSafetyIssues");
            }
        }

    }
部分类安全问题
{
局部空腔加载()
{
JobNumber.CalculatesAffetySueToals();
}
}
部分类安全问题
{
公共无效刷新总数(列出安全问题)
{
TotalSubmissions=safetyIssues.Count(c=>c.SafetyCategory==1);
TotalInclutions=safetyIssues.Count(c=>c.SafetyCategory==2);
TotalSafetyMeetings=safetyIssues.Count(c=>c.SafetyCategory==3);
TotalToolboxTalk=safetyIssues.Count(c=>c.SafetyCategory==4);
TotalRecognitions=safetyIssues.Count(c=>c.SafetyCategory==5);
TotalIncidents=safetyIssues.Count(c=>c.SafetyCategory==6);
ActualSafetySubmissions=safetyIssues.Count(c=>c.JobSafetyNo.Trim()!=“”);
}
}
部分类作业编号:IDataErrorInfo
{
public void CalculatesAffetySueTowals()
{
如果(SafetyIssuesTotals==null)
SafetyIssuesTotals=新的SafetyIssuesTotals();
/*如果我将下面的部分注释掉,它就会工作。似乎如果我使用SafetyIssues实体(在本例中是SafetyIssues.Count()来分配内容,问题就会发生*/
SafetyIssuesTotals.TotalActualSafetySubmissions=SafetyIssues.Count;
安全事件总数=
SafetyIssues.Count(s=>s.SafetyCategory1!=null&&s.SafetyCategory1.SafetyCategoryID==6);
安全性问题总归纳法=
SafetyIssues.Count(s=>s.SafetyCategory1!=null&&s.SafetyCategory1.SafetyCategoryID==2);
安全性问题总计识别=
SafetyIssues.Count(s=>s.SafetyCategory1!=null&&s.SafetyCategory1.SafetyCategoryID==5);
安全问题总安全会议=
SafetyIssues.Count(s=>s.SafetyCategory1!=null&&s.SafetyCategory1.SafetyCategoryID==3);
安全性问题总计提交=
SafetyIssues.Count(s=>s.SafetyCategory1!=null&&s.SafetyCategory1.SafetyCategoryID==1);
SafetyIssuesTotals.TotalToolboxTalk=
SafetyIssues.Count(s=>s.SafetyCategory1!=null&&s.SafetyCategory1.SafetyCategoryID==4);
//////////////////////////////////////////////////////////////////////////////////////
}
公共图书馆不报告安全问题
{
得到
{
_noReportedSafetyIssues=SafetyIssues.Count==0;
返回-不报告安全问题;
}
设置
{
_noReportedSafetyIssues=值;
SendPropertyChanged(“无报告安全问题”);
}
}
}

我只是不明白为什么它要提取同一条记录的两个副本。希望你们能帮助。

好吧,我解决了这个问题。问题出在我的dbml代码中。我想我是在作业有机会完成加载之前计算总数的。所以,当我在作业完成加载后将计算转移到时,它起了作用。下面是我更改的代码d:

之前

    partial class SafetyIssue
    {

        partial void OnLoaded()
        {
            JobNumber.CalculateSafetyIssueTotals();  // I needed to move this to the JobNumber partial class
        }

    }

    partial class SafetyIssueTotals
    {
       public void RefreshTotals(List<SafetyIssue> safetyIssues)
       {
           TotalSubmissions = safetyIssues.Count(c => c.SafetyCategory == 1);
           TotalInductions = safetyIssues.Count(c => c.SafetyCategory == 2);
           TotalSafetyMeetings = safetyIssues.Count(c => c.SafetyCategory == 3); 
           TotalToolboxTalk = safetyIssues.Count(c => c.SafetyCategory == 4);
           TotalRecognitions = safetyIssues.Count(c => c.SafetyCategory == 5);
           TotalIncidents = safetyIssues.Count(c => c.SafetyCategory == 6);
           ActualSafetySubmissions = safetyIssues.Count(c => c.JobSafetyNo.Trim() != "");
       }

    }


    partial class JobNumber:IDataErrorInfo
    {

        public void CalculateSafetyIssueTotals()
        {
            if (SafetyIssuesTotals == null)
                SafetyIssuesTotals = new SafetyIssuesTotals();


            SafetyIssuesTotals.TotalActualSafetySubmissions = SafetyIssues.Count;
            SafetyIssuesTotals.TotalIncidents =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 6);
            SafetyIssuesTotals.TotalInductions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 2);
            SafetyIssuesTotals.TotalRecognitions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 5);
            SafetyIssuesTotals.TotalSafetyMeetings =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 3);
            SafetyIssuesTotals.TotalSubmissions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 1);
            SafetyIssuesTotals.TotalToolboxTalk =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 4);

        }

    }
部分类安全问题
{
局部空腔加载()
{
JobNumber.CalculatesAffetySueTotals();//我需要将其移动到JobNumber分部类
}
}
部分类安全问题
{
公共无效刷新总数(列出安全问题)
{
TotalSubmissions=safetyIssues.Count(c=>c.SafetyCategory==1);
TotalInclutions=safetyIssues.Count(c=>c.SafetyCategory==2);
TotalSafetyMeetings=safetyIssues.Count(c=>c.SafetyCategory==3);
TotalToolboxTalk=safetyIssues.Count(c=>c.SafetyCategory==4);
TotalRecognitions=safetyIssues.Count(c=>c.SafetyCategory==5);
TotalIncidents=safetyIssues.Count(c=>c.SafetyCategory==6);
ActualSafetySubmissions=safetyIssues.Count(c=>c.JobSafetyNo.Trim()!=“”);
}
}
部分类作业编号:IDataErrorInfo
{
public void CalculatesAffetySueTowals()
{
如果(SafetyIssuesTotals==null)
SafetyIssuesTotals=新的SafetyIssuesTotals();
SafetyIssuesTotals.TotalActualSafetySubmissions=SafetyIssues.Count;
安全事件总数=
SafetyIssues.Count(s=>s.SafetyCategory1!=null&&s.SafetyCategory1.SafetyCategoryID==6);
安全性问题总归纳法=
    partial class SafetyIssue
    {

        partial void OnLoaded()
        {
            JobNumber.CalculateSafetyIssueTotals();  
        }

    }

    partial class SafetyIssueTotals
    {
       public void RefreshTotals(List<SafetyIssue> safetyIssues)
       {
           TotalSubmissions = safetyIssues.Count(c => c.SafetyCategory == 1);
           TotalInductions = safetyIssues.Count(c => c.SafetyCategory == 2);
           TotalSafetyMeetings = safetyIssues.Count(c => c.SafetyCategory == 3); 
           TotalToolboxTalk = safetyIssues.Count(c => c.SafetyCategory == 4);
           TotalRecognitions = safetyIssues.Count(c => c.SafetyCategory == 5);
           TotalIncidents = safetyIssues.Count(c => c.SafetyCategory == 6);
           ActualSafetySubmissions = safetyIssues.Count(c => c.JobSafetyNo.Trim() != "");
       }

    }


    partial class JobNumber:IDataErrorInfo
    {

        public void CalculateSafetyIssueTotals()
        {
            if (SafetyIssuesTotals == null)
                SafetyIssuesTotals = new SafetyIssuesTotals();

/* If I comment the part below out, it works.  Seems like if I use the SafetyIssues entity at all (in this case SafetyIssues.Count() to  assign things, the problem happens */

            SafetyIssuesTotals.TotalActualSafetySubmissions = SafetyIssues.Count;
            SafetyIssuesTotals.TotalIncidents =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 6);
            SafetyIssuesTotals.TotalInductions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 2);
            SafetyIssuesTotals.TotalRecognitions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 5);
            SafetyIssuesTotals.TotalSafetyMeetings =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 3);
            SafetyIssuesTotals.TotalSubmissions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 1);
            SafetyIssuesTotals.TotalToolboxTalk =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 4);

    //////////////////////////////////////////////////////////////////////////////////////
        }

        public bool NoReportedSafetyIssues
        {
            get
            {
                _noReportedSafetyIssues = SafetyIssues.Count == 0;
                return _noReportedSafetyIssues;
            }
            set
            {
                _noReportedSafetyIssues = value;
                SendPropertyChanged("NoReportedSafetyIssues");
            }
        }

    }
    partial class SafetyIssue
    {

        partial void OnLoaded()
        {
            JobNumber.CalculateSafetyIssueTotals();  // I needed to move this to the JobNumber partial class
        }

    }

    partial class SafetyIssueTotals
    {
       public void RefreshTotals(List<SafetyIssue> safetyIssues)
       {
           TotalSubmissions = safetyIssues.Count(c => c.SafetyCategory == 1);
           TotalInductions = safetyIssues.Count(c => c.SafetyCategory == 2);
           TotalSafetyMeetings = safetyIssues.Count(c => c.SafetyCategory == 3); 
           TotalToolboxTalk = safetyIssues.Count(c => c.SafetyCategory == 4);
           TotalRecognitions = safetyIssues.Count(c => c.SafetyCategory == 5);
           TotalIncidents = safetyIssues.Count(c => c.SafetyCategory == 6);
           ActualSafetySubmissions = safetyIssues.Count(c => c.JobSafetyNo.Trim() != "");
       }

    }


    partial class JobNumber:IDataErrorInfo
    {

        public void CalculateSafetyIssueTotals()
        {
            if (SafetyIssuesTotals == null)
                SafetyIssuesTotals = new SafetyIssuesTotals();


            SafetyIssuesTotals.TotalActualSafetySubmissions = SafetyIssues.Count;
            SafetyIssuesTotals.TotalIncidents =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 6);
            SafetyIssuesTotals.TotalInductions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 2);
            SafetyIssuesTotals.TotalRecognitions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 5);
            SafetyIssuesTotals.TotalSafetyMeetings =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 3);
            SafetyIssuesTotals.TotalSubmissions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 1);
            SafetyIssuesTotals.TotalToolboxTalk =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 4);

        }

    }
    partial class SafetyIssue
    {

    }

    partial class SafetyIssueTotals
    {
       public void RefreshTotals(List<SafetyIssue> safetyIssues)
       {
           TotalSubmissions = safetyIssues.Count(c => c.SafetyCategory == 1);
           TotalInductions = safetyIssues.Count(c => c.SafetyCategory == 2);
           TotalSafetyMeetings = safetyIssues.Count(c => c.SafetyCategory == 3); 
           TotalToolboxTalk = safetyIssues.Count(c => c.SafetyCategory == 4);
           TotalRecognitions = safetyIssues.Count(c => c.SafetyCategory == 5);
           TotalIncidents = safetyIssues.Count(c => c.SafetyCategory == 6);
           ActualSafetySubmissions = safetyIssues.Count(c => c.JobSafetyNo.Trim() != "");
       }

    }


    partial class JobNumber:IDataErrorInfo
    {

        partial void OnLoaded()
        {
           CalculateSafetyIssueTotals(); //moved the call to the function here. 
        }

        public void CalculateSafetyIssueTotals()
        {
            if (SafetyIssuesTotals == null)
                SafetyIssuesTotals = new SafetyIssuesTotals();


            SafetyIssuesTotals.TotalActualSafetySubmissions = SafetyIssues.Count;
            SafetyIssuesTotals.TotalIncidents =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 6);
            SafetyIssuesTotals.TotalInductions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 2);
            SafetyIssuesTotals.TotalRecognitions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 5);
            SafetyIssuesTotals.TotalSafetyMeetings =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 3);
            SafetyIssuesTotals.TotalSubmissions =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 1);
            SafetyIssuesTotals.TotalToolboxTalk =
                SafetyIssues.Count(s => s.SafetyCategory1 != null && s.SafetyCategory1.SafetyCategoryID == 4);

        }


    }