1

SQLiteデータベースにデータを格納するC#でプロジェクトを開発しています(または開発しようとしています)。オブジェクトリレーショナルマッピングにLinqを使用したいと思います。私が読んだことによると、System.Data.SQLitedblinqをダウンロードすれば、SQLiteで使用することができます。

また、ほとんどの場合DBからデータを読み取るために機能しますが、何かを挿入しようとするとSQL構文エラーが発生します。Linqがそのようなクエリを実行しようとしていることをログにチェックインしました:

{INSERT INTO [sometable]([columnone], [columntwo])
VALUES (@p0, @p1)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input String (Size = 4000; Prec = 0; Scale = 0) [foo]
-- @p1: Input String (Size = 4000; Prec = 0; Scale = 0) [bar]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
}

SQLiteではなく、MSServerのSQLクエリのようです。動揺する部分はこれSqlProvider(Sql2008)です。dblinqが提供するものに置き換えるべきではありませんか?

私のデータベースクラスは次のようになります。

[Database]
class MyDatabase : DataContext
{
    public LibraryDatabase()
        : base(new SQLiteConnection(
                    "DbLinqProvider=Sqlite; " +
                    "Data Source=database.s3db;"))
    {
    }

    public Table<SomeObject> SomeTable;
}

接続文字列は、dblinqwikiから取得されます。

なぜそれが機能しないのですか?.NET 4.0を使用しているからですか?誰かがそのような組み合わせをうまく使用したことがありますか?Linqプロバイダーを置き換える別の方法はありますか?

編集:テーブルマッピング:((foreachループを使用して)テーブルを読み取ることは機能しているように見えるので、エラーがここにあるとは思えませんが)

[Table(Name="sometable")]
class Element
{
    [Column(Name = "id", IsPrimaryKey = true, IsDbGenerated=true)]
    public int Id { get; set; }

    [Column(Name="columnone")]
    public string PropertyOne {get; set;}

    [Column(Name="columntwo")]
    public string PropertyTwo {get; set;}
}

テーブル間のすべての関係は、テストのためにコメント化されました(役に立ちません)。次に、要素が次のコードで挿入されます。

myDatabase.SomeTable.InsertOnSubmit(element);
myDatabase.SubmitChanges();
4

1 に答える 1

1

ORMにEntityFrameworkを使用していると思いますか?

MyDatabaseクラスでは、DataContextから継承しています。これは、LINQtoSQLフレームワークのメインエントリポイントを表します。これはSQLServerでうまく機能します。SQLiteではあまりうまくいきません。

代わりに、ObjecContextクラスから継承します。これにより、エンティティデータをオブジェクトとしてクエリおよび操作するための機能が提供されます。おそらく、クエリに使用するコードを変更する必要がありますが、それは非常に簡単なはずです。

EntityFrameworkとObjectContextを検索してみてください。良い例がたくさんあります。

パトリック。

于 2011-11-25T16:51:14.623 に答える