SQLite 网络扩展 一对多关系不插入/保存/更新子项

本文关键字:保存 更新 插入 网络 扩展 一对多 关系 SQLite | 更新日期: 2023-09-27 18:31:01

我正在尝试使用 SQLite 网络扩展为游戏做一个笔记应用程序,它使用 3 层模型,Game [1 has many *] Character [1 has many *] Note [1 applies to *] Character

我在Visual Studio Community 2015中使用Xamarin,并使用NuGet包管理器安装了SQLiteNetExtensions。

我还没有超过游戏和角色之间的第一级关系,并且插入数据库(无论是通过初始插入然后更新,还是递归使用 InsertWithChildren)不会更新游戏对象中的角色。它只会为游戏模型中的List<CharacterModel>生成一个空对象。然而,游戏和角色都在数据库中制作。

抽象基础模型

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

为了测试插入到数据库中,我在 Main 活动中执行此操作:

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.CharacterstestCharacter.Game

SQLite 网络扩展 一对多关系不插入/保存/更新子项

SQLite-Net Extensions 使用加载和写入关系的其他方法扩展了 SQLite.Net。您正在使用UpdateWithChildren方法写入与数据库的关系,但不是从数据库加载关系GetAll因为这是一种普通 SQLite.Net 方法。

尝试使用 SQLite.Net 方法的任何*WithChildren变体,例如:

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

或:

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

或者,您可以加载调用GetChildren方法的现有对象的关系:

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

由于缺少CascadeOperations = CascadeOperation.All,我遇到了同样的问题。添加说明如下,解决我的问题

[OneToMany(CascadeOperations = CascadeOperation.All)]