4

SQLite Net Extensions を使用して、ゲーム用のメモ取りアプリを作成しようとしています。3 層のモデルを使用しています。Game [1 has many *] Character [1 has many *] Note [1 applies to *] Character

Visual Studio Community 2015 で Xamarin を使用しており、NuGet パッケージ マネージャーを使用して SQLiteNetExtensions をインストールしています。

ゲームとキャラクターの間の関係の最初のレベルをまだ超えていません。データベースへの挿入 (最初の挿入とその後の更新を介して、または InsertWithChildren を再帰的に使用するかどうか) は、ゲーム オブジェクトのキャラクターを更新していません。List<CharacterModel>内部の GameModelの null オブジェクトになるだけです。ただし、ゲームとキャラクターの両方がデータベースに登録されています。

抽象基本モデル

public abstract class IdentifiableModel
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
}

ゲームモデル

[Table("Game")]
public class GameModel : IdentifiableModel
{
    [MaxLength(64)]
    public string Name { get; set; }

    [OneToMany]
    public List<CharacterModel> Characters { get; set; }
}

キャラクターモデル

[Table("Characters")]
public class CharacterModel : IdentifiableModel
{
    [ForeignKey(typeof (GameModel))]
    public int GameId { get; set; }

    [ManyToOne]
    public GameModel Game { get; set; }

    public string FullName { get; set; }
    public string ShortName { get; set; }
}

データベースへの挿入をテストするには、メイン アクティビティでこれを行います。

var game =
    new GameModel
    {
        Name = "Game"
    };

database.Insert(game);

var characters = new List<CharacterModel>
{
    new CharacterModel
    {
        FullName = "Dude"
    },
    new CharacterModel
    {
        FullName = "Dudette"
    }
};

database.InsertAll(characters);

game.Characters = characters;

database.UpdateWithChildren(game);

var testGame = database.GetAll<GameModel>().FirstOrDefault();
var testCharacter = database.GetAll<CharacterModel>().FirstOrDefault();

Console.WriteLine(testGame.Id + " " + testGame.Name);
Console.WriteLine(testCharacter.Id + " " + testCharacter.FullName + " " + testCharacter.GameId);
//testGame.Characters;  // THIS IS NULL.
//testCharacter.Game;  // THIS IS NULL.

私はこれをどこからソートし始めたらよいのか途方に暮れています。


編集:継承されていない主キーを使用しても、まったく違いはありませんでした。testGame.CharactersまたはにまだデータがありませんtestCharacter.Game

4

2 に答える 2

5

SQLite-Net 拡張機能は、関係を読み込んで書き込む追加のメソッドで SQLite.Net を拡張します。メソッドを使用してデータベースへの関係を記述していますが、単純な SQLite.Net メソッドであるUpdateWithChildrenため、データベースから関係をロードしていません。GetAll

*WithChildrenたとえば、次のように、SQLite.Net メソッドのバリアントを使用してみてください。

var testGame = database.GetAllWithChildren<GameModel>().FirstOrDefault();

また:

var testGame = database.GetWithChildren<GameModel>(game.Id);

GetChildrenまたは、メソッドを呼び出して既存のオブジェクトの関係をロードすることもできます。

var testGame = database.GetAll<GameModel>().FirstOrDefault();
testGame.GetChildren();
于 2016-01-20T09:53:06.927 に答える