Последователността съдържа повече от един елемент, докато преобразува db данни в List

//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; }
        [...]
    }

NoteTag

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), но вашата бележка има ID(PK), а етикетът има ID(PK). Забележка:

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

NoteTag

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 == givenTag))); - person Hasta Tamang; 03.01.2016