Ответ 1
У меня была ошибка, где я получил System.InvalidOperationException
с сообщением Sequence contains no matching element
, потому что у меня было неправильное строковое значение, переданное в .HasColumnType()
в моей конфигурации таблицы.
Я использую 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-сервисов с использованием Code First Entity Framework.
У меня была ошибка, где я получил System.InvalidOperationException
с сообщением Sequence contains no matching element
, потому что у меня было неправильное строковое значение, переданное в .HasColumnType()
в моей конфигурации таблицы.
Я просто испытал ту же проблему. Сначала код из мастера базы данных сгенерировал один из столбцов как [Column(TypeName = "date")]
.
Вызов .saveChanges()
привел к Sequence contains no elements
.
После изменения определенного столбца на [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.
Column Attribute: [Column (string name, Properties:[Order = int],[TypeName = string])
name: имя столбца в таблице базы данных.
Порядок: порядок столбца, начиная с нулевого индекса. (Необязательно)
TypeName: тип данных столбца. (Необязательно)
Это TypeName должно быть только именем типа и не должно включать точность или масштаб или длину и любые другие вещи. Например, следующее приведет к ошибке
[Column(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, но если вы не можете или не хотите их использовать, вы можете использовать статический класс с некоторыми статическими полями на них, чтобы вы могли intellisense его довольно хорошо:
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 )
Я знаю, я знаю, это лениво, я должен помнить эти типы, но каждый раз так часто я нахожусь в Stack Overflow, и это просто экономит время...
У меня получилось такое же сообщение об ошибке, когда я переименовал мою модель Member в Student, и у меня было свойство навигации в каком-то другом классе:
public IList<Student> Members { get; set; }
Я изменил это на:
public IList<Student> Students { get; set; }
и проблема решена!
Я получил эту ошибку при определении наследования таблиц по типам с помощью Fluent API (как класса, производного от EntityTypeConfiguration<T>
) и ошибочно переопределенного поля, которое уже было определено в конфигурации базового класса (и оба были в точности одинаковыми). Я использовал пакет nuget EntityFramework 6.2.0.
Я был пойман с этим, потому что я ссылался на свойство reference вместо свойства Id.
var t = modelBuilder.Entity<CyDocument>();
t.HasIndex(b => b.DocTypeId);
Для меня это помогло при переключении класса проекта на Установить как проект запуска