数据库
首页 > 数据库> > c#-SQLite Net Extensions OneToMany关系未插入/保存/更新子级

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

作者:互联网

我试图使用SQLite Net Extensions做游戏笔记应用程序,它使用3层模型,游戏[1有很多*]字符[1有很多*]注意[1适用于*]字符

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

我还没有超越游戏和角色之间的第一级关系,并且插入数据库(无论是通过初始插入然后更新,还是递归使用InsertWithChildren)都不会更新Game对象中的角色.它只是导致List< CharacterModel>的空对象.在GameModel中.但是,游戏和角色都在数据库中.

抽象基础模型

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.Characters或testCharacter.Game中仍然没有数据

解决方法:

SQLite-Net扩展使用加载和写入关系的其他方法扩展了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();

标签:xamarin,sqlite-net,sqlite-net-extensions,c
来源: https://codeday.me/bug/20191119/2033922.html