Последовательность не содержит соответствующего элемента - EntityFramework

Я использую EF 6.1.0 и создаю Службу WCF.

Сначала я создал библиотеку классов, содержащую мои сущности, Mappers и Context для инициализации EF. Я также создал класс, содержащий создание экземпляра контекста, и имею этот код:

public IQueryable<[Entity]> GetAll()
{
    return context.[Entity].AsQueryable();
}

С другой стороны, я создал службу WCF для того же проекта и вызывает функцию GetAll() в файле.svc следующим образом:

public List<[Entity]> GetList()
{
    [iObject] repository = new [Object](new Context());
    return repository.GetAll().ToList();
}

Проект строительный. Я даже проверяю cconfiguration, и это находится в правильной БД. Однако база данных и таблицы, которые предположительно созданы, не существуют, и в ответе появляется ошибка "Последовательность не содержит соответствующий элемент".

Если это сбивает с толку, можете ли вы указать мне какую-то ссылку на WCF Services с использованием Code First Entity Framework.

11 ответов

У меня была ошибка, где я получил System.InvalidOperationException с сообщением Sequence contains no matching element потому что мне было передано неверное строковое значение .HasColumnType() в моей таблице конфигурации.

Я только что испытал ту же проблему. The Code First from database wizard generated one of the columns as [Column(TypeName = "date")],

призвание .saveChanges() resulted in the Sequence contains no elements,

After changing the defined column to [DataType(DataType.DateTime)] это сработало, как и ожидалось.

Я также получал ту же ошибку при добавлении миграции или обновлении базы данных.

Причина в том, что я использовал неправильный тип столбца

[Column("ImageType", TypeName = "varchar(20)")]
public string ImageType
{
     get;
     set;
}

Но когда я снял 20 с varchar, он начал работать для меня

[Column("ImageType", TypeName = "varchar")]
public string ImageType
{
    get;
    set;
}

Для меня это сообщение было из-за недопонимания для TypeName в атрибуте Column.

Атрибут столбца: [Столбец (имя строки, Свойства: [Order = int], [TypeName = string])

name: имя столбца в таблице базы данных.
Порядок: порядок столбца, начиная с нулевого индекса. (Необязательный)
TypeName: тип данных столбца. (Необязательный)

Это TypeName должно быть только именем типа и не должно включать точность или масштаб или длину и любые другие вещи. Например, следующее приведет к ошибке

[Столбец (TypeName = "nvarchar(600)")]

в то время как ниже один будет работать нормально, однако вы можете захотеть иметь конкретный размер столбца и для этого одним из способов является использование свободного API

[Column (TypeName = "nvarchar")]

Entity Framework выдает это исключение, если тип столбца недопустим. Например:

// This will throw an error. There is no such type name.
[Column(TypeName = "Invalid")]
public string Column1 { get; set; }

// Works.
[Column(TypeName = "varchar")]
public string Column1 { get; set; }

Смотрите эти примеры:

Ага. Поймал меня также, потому что в момент отвлечения я положил буквальный длинный там для столбца bigint, то есть HasColumnType("long")- ты можешь в это поверить?! Какой клоун!

Генераторы обычно создают ваши классы EF должным образом, но если вы не можете или не хотите использовать один из них, вы можете использовать статический класс с некоторыми статическими строковыми полями на них, чтобы вы могли легко его осмыслить:

public static class DatabaseColumnTypes
{
    /// <summary>
    /// Use this for 'boolean' values.
    /// </summary>
    public static string BitColumn = "bit";

    /// <summary>
    /// Use this for 'byte' values.
    /// </summary>
    public static string TinyIntColumn = "tinyint";

    /// <summary>
    /// Use this for 'long' values.
    /// </summary>
    public static string BigIntColumn = "bigint";

    /// <summary>
    /// Use this for 'string' values.
    /// </summary>
    public static string VarcharColumn = "varchar";

    // etc
}

Теперь вы можете сделать HasColumnType( DatabaseColumnTypes.BigIntColumn )

Я знаю, я знаю, это лениво, я должен помнить эти типы, но время от времени я нахожусь в Переполнении Стека, ища это, и это только экономит время…

Я получил то же сообщение об ошибке, когда я переименовал модель Member в Student, и у меня было свойство навигации в каком-то другом классе:

public IList<Student> Members { get; set; }

Я изменил это на:

public IList<Student> Students { get; set; }

и проблема была решена!

Я застрял с тем же исключениемSystem.InvalidOperationExceptionс сообщениемSequence contains no matching element. Это было вEntity Framework 6.0.0. Когда я обновился доEntity Framework 6.4.4Я получил исключение с четким сообщениемAdditional information: The store type 'VARCHAR2(10)' could not be found in the OracleEFProvider provider manifest

      [Column("SCOPE_ID", TypeName = "varchar(10)")]
public string ScopeId
{
     get;
     set;
}

Я изменил свой код, как показано ниже, удалив TypeName

      [Column("SCOPE_ID"]
public string ScopeId
{
    get;
    set;
}

Я получил эту ошибку при определении наследования таблиц по типам с помощью Fluent API (как класс, производный от EntityTypeConfiguration<T>) и ошибочно переопределенное поле, которое уже было определено в конфигурации базового класса (и оба были абсолютно одинаковыми). Я использовал пакет nuget EntityFramework 6.2.0.

Я попался с этим, потому что я ссылался на свойство ссылки вместо свойства Id.

        var t = modelBuilder.Entity<CyDocument>();
        t.HasIndex(b => b.DocTypeId);

Для меня это помогло, когда переключил класс проекта на Установить как стартовый проект

Другие вопросы по тегам