gpt4 book ai didi

c# - SQLite Net Extensions OneToMany 关系不插入/保存/更新子项

转载 作者:行者123 更新时间:2023-11-30 14:08:30 24 4
gpt4 key购买 nike

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

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

我还没有超过 Game 和角色之间的第一级关系,插入数据库(无论是通过初始插入然后更新,还是递归地使用 InsertWithChildren)并没有更新 Game 对象中的角色。它只会导致 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; }
}

为了测试插入到数据库中,我在主要事件中执行此操作:

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

最佳答案

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();

关于c# - SQLite Net Extensions OneToMany 关系不插入/保存/更新子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34890362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com