C# ';序列包含多个元素';(InvalidOperationException)在使用Linq2Sql时由外部系统.Core调用引发

C# ';序列包含多个元素';(InvalidOperationException)在使用Linq2Sql时由外部系统.Core调用引发,c#,linq-to-sql,external,invalidoperationexception,C#,Linq To Sql,External,Invalidoperationexception,首先让我解释一下,我完全理解为什么会抛出这个invalidoOperationException,我只是在寻找一种避免抛出它的方法。有一个对System.Linq.Enumerable.SingleOrDefault()的调用,我可以在Visual Studio 2010调用堆栈窗口中看到该调用。但是,调用是在externalLinq2Sqlcode中进行的,因此我没有权限更改它 (抱歉,您可能需要放大才能正确查看此图像) 执行外部之前的最后一个内部代码调用位于应用程序dbml.designe

首先让我解释一下,我完全理解为什么会抛出这个
invalidoOperationException
,我只是在寻找一种避免抛出它的方法。有一个对
System.Linq.Enumerable.SingleOrDefault()的调用,我可以在Visual Studio 2010调用堆栈窗口中看到该调用。但是,调用是在external
Linq2Sql
code中进行的,因此我没有权限更改它

(抱歉,您可能需要放大才能正确查看此图像)

执行外部之前的最后一个内部代码调用位于应用程序
dbml.designer.cs
文件中,我确实可以访问该文件,但仍然无法编辑,因为它会自动更新并丢失自定义更改。它位于应用程序中使用的一个数据库表的(
Linq2Sql
)属性设置程序中,似乎是调用
\u DbAudioTrackContributors引起的问题。实体
对象:

public DbAudioTrackContributor DbAudioTrackContributors
{
    get
    {
        return this._DbAudioTrackContributors.Entity;
    }
    set
    {
        // This is the last internal line before the Exception 
        DbAudioTrackContributor previousValue = this._DbAudioTrackContributors.Entity;

        // Execution never reaches here
        if (((previousValue != value) || 
        (this._DbAudioTrackContributors.HasLoadedOrAssignedValue == false)))
        {
            this.SendPropertyChanging();
            if ((previousValue != null))
            {
                this._DbAudioTrackContributors.Entity = null;
                previousValue.DbAudioTrack = null;
            }
            this._DbAudioTrackContributors.Entity = value;
            if ((value != null))
            {
                value.DbAudioTrack = this;
            }
            this.SendPropertyChanged("DbAudioTrackContributors");
        }
    }
}
如果有人能为我提供
EntityRef
结构的内部代码(甚至是
Entity
属性),这可能会帮助我找出问题的原因

在抛出
invalidoOperationException
之前,我自己的代码的最后一行是调用
dataContext.SubmitChanges()

copytodobaudiotrack
方法只是将
AudioTrack
对象中的所有属性值复制到
Linq2Sql
生成的
DbAudioTrack
对象,下面显示了
UpdateAudioTrackContributors
方法

private void UpdateAudioTrackContributors(MidasDataContext dataContext, AudioTrack audioTrack)
{
    DataList<Label> labels = new DataList<Label>(
        audioTrack.Labels.Except(audioTrack.OriginalState.Labels));
    if (labels.Count > 0) AddAudioTrackContributors(dataContext, audioTrack, labels);
    labels = new DataList<Label>(audioTrack.OriginalState.Labels.Except(audioTrack.Labels));
    if (labels.Count > 0) DeleteAudioTrackContributors(dataContext, audioTrack, labels);
}
DeleteAudioTrackContributors

List<DbAudioTrackContributor> dbAudioTrackContributors = new List<DbAudioTrackContributor>();
foreach (T dataListEntry in dataList)
{
    DbAudioTrackContributor dbAudioTrackContributor = dataContext.DbAudioTrackContributors.Where(d => d.DataListId == dataListEntry.Id && d.AudioTrackId == audioTrack.Id).FirstOrDefault();
    if (dbAudioTrackContributor != null) dbAudioTrackContributors.Add(dbAudioTrackContributor);
}
dataContext.DbAudioTrackContributors.DeleteAllOnSubmit(dbAudioTrackContributors);
List dbAudioTrackContributors=newlist();
foreach(数据列表中的T dataListEntry)
{
DbAudioTrackContributor DbAudioTrackContributor=dataContext.DbAudioTrackContributors.Where(d=>d.DataListId==dataListEntry.Id&&d.AudioTrackId==audioTrack.Id)。FirstOrDefault();
如果(dbAudioTrackContributor!=null)dbAudioTrackContributor.Add(dbAudioTrackContributor);
}
dataContext.DbaudioTrackContractors.DeleteAllOnSubmit(DbaudioTrackContractors);
同样,在执行过程中单步执行代码表明,上面的代码也正确地选择了要删除的对象。因为我看不到我的代码中有任何问题,所以我不知道下一步该看哪里


如果有人对如何进行有任何想法,我将非常乐意听取他们的意见。非常感谢。

好的,这是一个可怕的问题,没有关于实际原因的明确线索。它原来是
Linq2Sql
dbml文件中
DbAudioTrackContributor
表的定义

幸运的是,我还有一个
DbMasterTrackContributor
表,它没有遇到相同的错误。在比较了所有与这两个表相关的代码和这次更新之后,我发现没有任何差异。然后,我决定查看
Linq2Sql
生成的设计器代码,并注意到两个表定义之间的差异

DbAudioTrackContributor
表注册为
EntityRef
,而正在工作的
DbMasterTrackContributor
表注册为
EntitySet

在线查看它们之间的差异后,发现
EntityRef
用于一对一关系,而
EntitySet
用于一对多和多对多关系。因此,我怀疑它们都应该声明为
EntitySet
,因此我从dbml文件中删除了该表,然后重新添加了它


这样做之后,它又开始工作了!因此,我学到了一个宝贵的教训:如果我有一个与dbml相关的错误,请首先尝试从dbml文件中删除并重新添加可疑表。

DbAudioTrackContributors的setter中的哪一行是7717?这是执行到外部之前的最后一个内部代码调用-第一个代码示例中标记的行。不过,我现在已经设法解决了这个问题,但感谢您的关注。
List<DbAudioTrackContributor> dbAudioTrackContributors = new List<DbAudioTrackContributor>();
foreach (T dataListEntry in dataList)
{
    DbAudioTrackContributor dbAudioTrackContributor = new DbAudioTrackContributor();
    CopyToDbAudioTrackContributor(audioTrack, dataListEntry, dbAudioTrackContributor, contributorType);
    dbAudioTrackContributors.Add(dbAudioTrackContributor);
}
dataContext.DbAudioTrackContributors.InsertAllOnSubmit(dbAudioTrackContributors);
List<DbAudioTrackContributor> dbAudioTrackContributors = new List<DbAudioTrackContributor>();
foreach (T dataListEntry in dataList)
{
    DbAudioTrackContributor dbAudioTrackContributor = dataContext.DbAudioTrackContributors.Where(d => d.DataListId == dataListEntry.Id && d.AudioTrackId == audioTrack.Id).FirstOrDefault();
    if (dbAudioTrackContributor != null) dbAudioTrackContributors.Add(dbAudioTrackContributor);
}
dataContext.DbAudioTrackContributors.DeleteAllOnSubmit(dbAudioTrackContributors);