Последовательность содержит более одного элемента при преобразовании данных БД в список

//searchText contains tags in one string. E.g. "programming javascript angular"
string[] separators = { " " };
//Splitting string to array
List<string> tags = searchText.Split(separators, StringSplitOptions.RemoveEmptyEntries).ToList();

//getting notes which all tags equals tags given by user            
var allNotes = db.Notes.Where(dbnote => tags.All(givenTag => dbnote.NoteTags.Any(dbNoteTag => dbNoteTag.Tag.Name == givenTag))).Include(x => x.NoteTags).ThenInclude(x => x.Tag);
var dataToList = allNotes.ToList();

Проблема появляется в последней строке.

Исключение типа «System.InvalidOperationException» возникло в mscorlib.dll, но не было обработано в пользовательском коде.

Дополнительная информация: последовательность содержит более одного элемента

Примечание:

public class Note
    {
        public Note()
        {
            NoteTags = new HashSet<NoteTag>();
        }

        public int ID { get; set; }
        public virtual ICollection<NoteTag> NoteTags { get; set; }
        [...]
    }

ПримечаниеТег

public class NoteTag
{
    public int NoteId { get; set; }
    public Note Note { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

Ярлык

public class Tag
{
    public Tag()
    {
        NoteTags = new HashSet<NoteTag>();
    }

    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<NoteTag> NoteTags { get; set; }
}

person Piotrek    schedule 03.01.2016    source источник


Ответы (1)


Код EF сначала использует соглашения во время сопоставления. Одним из соглашений является то, что он обрабатывает свойства с именами Id или TypenameId как первичные ключи (если вы не используете атрибут Key или пользовательское сопоставление), и поскольку он выполняет сравнение имени свойства без учета регистра, он создает исключение.

Кроме того, ваша таблица NoteTag имеет NoteId (FK) и TagId (FK), но ваша заметка имеет идентификатор (PK), а тег имеет идентификатор (PK). Примечание:

public class Note
    {
        public Note()
        {
            NoteTags = new HashSet<NoteTag>();
        }
        //primary key
        public int NoteId { get; set; }
        public virtual ICollection<NoteTag> NoteTags { get; set; }
        [...]
    }

ПримечаниеТег

public class NoteTag
{
    public int NoteId { get; set; }
    public Note Note { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}

Ярлык

public class Tag
{
    public Tag()
    {
        NoteTags = new HashSet<NoteTag>();
    }
    // primary key
    public int TagId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<NoteTag> NoteTags { get; set; }
}
person Hasta Tamang    schedule 03.01.2016
comment
Итак, вы думаете, что изменение имен ключей - это все, что мне нужно сделать? Безопасно ли делать это с некоторыми существующими в настоящее время данными? - person Piotrek; 03.01.2016
comment
Нет, теперь модель изменилась, поэтому вам придется удалить базу данных. - person Hasta Tamang; 03.01.2016
comment
Хорошо, поэтому я изменил имена, эффект тот же - person Piotrek; 03.01.2016
comment
@ Ludwik11 извините, это не сработало. Могу предложить еще одну вещь var allNotes = db.Notes.Include(x => x.NoteTags).ThenInclude(x => x.Tag).Where(dbnote => tags.All(givenTag => dbnote.NoteTags.Any (dbNoteTag => dbNoteTag.Tag.Name == заданныйTag))); - person Hasta Tamang; 03.01.2016