web-dev-qa-db-ja.com

シーケンスに一致する要素がありません-EntityFramework

私は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サービスのリンクをいくつか教えてください。

22
user1960948

テーブル構成の.HasColumnType()に誤った文字列値が渡されたため、System.InvalidOperationExceptionのメッセージSequence contains no matching elementが表示されるというバグがありました。

62
Ceisc

同じ問題が発生しました。データベースウィザードの最初のコードは、列の1つを[Column(TypeName = "date")]として生成しました。

.saveChanges()を呼び出すと、_Sequence contains no elements_が発生しました。

定義された列を[DataType(DataType.DateTime)]に変更した後、期待どおりに機能しました。

11
Joep Grooten

移行の追加またはデータベースの更新中にも同じエラーが発生しました。

間違った列タイプを使用していた理由

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

しかし、varcharから20を削除すると、それは私のために働き始めました

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

私にとってこのメッセージは、Column属性のTypeNameに対する誤解が原因でした。

列属性:[列(文字列名、プロパティ:[順序= int]、[タイプ名=文字列])

name:dbテーブルの列の名前。
順序:ゼロのインデックスから始まる列の順序。 (オプション)
TypeName:列のデータ型。 (オプション)

このTypeNameは、型の名前のみである必要があり、精度、スケール、長さなどを含めることはできません。たとえば、次の場合はエラーが発生します

[列(タイプ名= "nvarchar(600)")]

以下では問題なく機能しますが、特定のサイズの列が必要になる場合があります。そのためには、流れるようなAPIを使用します

[列(タイプ名= "nvarchar")]

2
user9762904

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; }

次の例をご覧ください。

1
Hans Vonn

うん。気が散った瞬間に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で調べて、時間を節約するだけです…

1
CarllDev

EntityTypeConfiguration<T>から派生したクラスとして)Fluent APIでタイプごとのテーブル継承を定義しているときにこのエラーが発生し、基本クラス構成ですでに定義されているフィールドを誤って再定義しました(両方ともまったく同じでした)。 EntityFramework 6.2.0 nugetパッケージを使用していました。

0
Jan Bońkowski

Idプロパティの代わりにreferenceプロパティを参照したため、これに巻き込まれました。

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

メンバーモデルの名前をStudentに変更したときに同じエラーメッセージが表示され、他のクラスにナビゲーションプロパティが含まれていました。

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

私はそれを次のように変更しました:

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

そして問題は解決されました!

0
Alireza Kahaei