1

私は非常に単純な関係を持っています。私のモデルは次のようになります。

public class Project
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }

    public string Name { get; set; }

    [ForeignKey(typeof(User))]
    public int ProjectManagerID { get; set; }

    [ManyToOne]
    public User ProjectManager { get; set; }
}

public class User
{
    public string Login { get; set; }

    [OneToMany]
    public List<Project> Projects { get; set; }
}

問題は、ユーザーを保存せずにユーザーへの参照を使用してプロジェクトを簡単に保存でき、制約違反の例外が発生しないことです。

database.Insert(new Project
    {
        Name = "aaa",
        ProjectManagerID = 8
    });

無効なユーザー ID を使用してプロジェクトをクエリすることもできますが、User テーブルにレコードが保存されていません。もう 1 つの興味深い点は、このデータベースを開くと、上記のような行を SQLite 管理ツールに保存できないことです。そのため、データベース スキーマは問題ないと確信しています。

これは、sqlite-net-extensions を使用した sqlite-net PCL ライブラリでは正常ですか?

更新: 私の sqlite バージョンは 3.8.7.4 です

4

2 に答える 2

3

はい、正常です。SQLite-Net 拡張機能は、外部キー制約をサポートしていない SQLite-Net の上に構築されているため、データベース層で外部キーが宣言されていません。

コアの SQLite-Net メソッドを使用すると、[ForeignKey]プロパティは何の制限もない単なる整数プロパティであるため、実行時エラーなしで自由に変更できます。

プロジェクトがデータベース レイヤーで外部キー制約を必要とする場合は、Executeメソッドを使用して、必要な列に手動で制約を追加できます。

アップデート:

SQLite では、外部キーはデフォルトで無効になっています。SQLite-Net で外部キーを有効にするには、プログラムの先頭に次のコードを追加する必要があります。このステートメントはデータベースに保持されないため、アプリケーションを起動するたびに実行する必要があります。

database.Execute("PRAGMA foreign_keys = ON");

有効になっていることを確認するには、次を使用できますPRAGMA foreign_keys

int result = database.ExecuteScalar<int>("PRAGMA foreign_keys");
if (result == 1) {
    // Foreign keys enabled
}

有効にした後、次のように、テーブル宣言に外部キーを追加できます ( sqlite はステートメントへの制約の追加をサポートしていませんALTER)。

CREATE TABLE child ( 
    id           INTEGER PRIMARY KEY, 
    parent_id    INTEGER, 
    description  TEXT,
    FOREIGN KEY (parent_id) REFERENCES parent(id)
);

CreateTable明らかにテーブルを手動で作成すると、SQLite-Netステートメントを使用しないように強制されます。

于 2015-02-09T11:27:31.343 に答える
0

問題が解決しました。データベースを Resources フォルダー (テンプレートとして) からアプリ データ フォルダーにコピーするのを忘れていたため、技術的には、外部キーなしで SQLite-Net によってデータベースが作成されていました。手伝ってくれてありがとう

于 2015-02-09T15:05:39.673 に答える