私はEF 6.1.0を使用しており、WCFサービスを作成していました。
最初に、EFを初期化するためのエンティティ、マッパー、およびコンテキストを含むクラスライブラリを作成しました。また、コンテキストのインスタンス化を含むクラスを作成し、次のコードを用意しました。
public IQueryable<[Entity]> GetAll()
{
return context.[Entity].AsQueryable();
}
一方、同じプロジェクトでWCFサービスを作成し、次のように.svcファイルで関数GetAll()を呼び出します。
public List<[Entity]> GetList()
{
[iObject] repository = new [Object](new Context());
return repository.GetAll().ToList();
}
プロジェクトは構築中です。私はcconfigurationもチェックし、それは正しいDBにあります。ただし、作成されたと考えられるデータベースとテーブルは存在せず、「シーケンスに一致する要素が含まれていません」というエラーが返されます。
これが混乱している場合は、Code First Entity Frameworkを使用したWCFサービスのリンクをいくつか教えてください。
テーブル構成の.HasColumnType()
に誤った文字列値が渡されたため、System.InvalidOperationException
のメッセージSequence contains no matching element
が表示されるというバグがありました。
同じ問題が発生しました。データベースウィザードの最初のコードは、列の1つを[Column(TypeName = "date")]
として生成しました。
.saveChanges()
を呼び出すと、_Sequence contains no elements
_が発生しました。
定義された列を[DataType(DataType.DateTime)]
に変更した後、期待どおりに機能しました。
移行の追加またはデータベースの更新中にも同じエラーが発生しました。
間違った列タイプを使用していた理由
[Column("ImageType", TypeName = "varchar(20)")]
public string ImageType
{
get;
set;
}
しかし、varcharから20を削除すると、それは私のために働き始めました
[Column("ImageType", TypeName = "varchar")]
public string ImageType
{
get;
set;
}
私にとってこのメッセージは、Column属性のTypeNameに対する誤解が原因でした。
列属性:[列(文字列名、プロパティ:[順序= int]、[タイプ名=文字列])
name:dbテーブルの列の名前。
順序:ゼロのインデックスから始まる列の順序。 (オプション)
TypeName:列のデータ型。 (オプション)
このTypeNameは、型の名前のみである必要があり、精度、スケール、長さなどを含めることはできません。たとえば、次の場合はエラーが発生します
[列(タイプ名= "nvarchar(600)")]
以下では問題なく機能しますが、特定のサイズの列が必要になる場合があります。そのためには、流れるようなAPIを使用します
[列(タイプ名= "nvarchar")]
うん。気が散った瞬間にbigint列のリテラルlongを入れたので、私も捕まえられました。つまり、HasColumnType("long")
-信じられますか?!なんてピエロだ!
ジェネレーターは通常、EFクラスを適切に作成しますが、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 )
を実行できます
私は知っています、これは怠惰です。これらのタイプを覚えておく必要がありますが、たまにStack Overflowで調べて、時間を節約するだけです…
(EntityTypeConfiguration<T>
から派生したクラスとして)Fluent APIでタイプごとのテーブル継承を定義しているときにこのエラーが発生し、基本クラス構成ですでに定義されているフィールドを誤って再定義しました(両方ともまったく同じでした)。 EntityFramework 6.2.0 nugetパッケージを使用していました。
Idプロパティの代わりにreferenceプロパティを参照したため、これに巻き込まれました。
var t = modelBuilder.Entity<CyDocument>();
t.HasIndex(b => b.DocTypeId);
メンバーモデルの名前をStudentに変更したときに同じエラーメッセージが表示され、他のクラスにナビゲーションプロパティが含まれていました。
public IList<Student> Members { get; set; }
私はそれを次のように変更しました:
public IList<Student> Students { get; set; }
そして問題は解決されました!