Последовательность не содержит соответствующего элемента - 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);
Для меня это помогло, когда переключил класс проекта на Установить как стартовый проект