SQLite Net Extensions OneToMany 关系不是 inserting/saving/updating Children
SQLite Net Extensions OneToMany relationship not inserting/saving/updating Children
我正在尝试使用 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)都没有更新游戏中的角色 object。它只会导致 GameModel 中的 List<CharacterModel>
为空 object。但是游戏和角色都在数据库中。
抽象基础模型
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 activity:
上做了这个
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.
我不知道从哪里开始整理这个,希望能得到一些帮助,运行。
编辑: 使用 non-inherited 主键没有任何区别。 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();
由于缺少 CascadeOperations = CascadeOperation.All,我遇到了同样的问题。添加如下指令解决我的问题
[OneToMany(CascadeOperations = CascadeOperation.All)]
我正在尝试使用 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)都没有更新游戏中的角色 object。它只会导致 GameModel 中的 List<CharacterModel>
为空 object。但是游戏和角色都在数据库中。
抽象基础模型
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 activity:
上做了这个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.
我不知道从哪里开始整理这个,希望能得到一些帮助,运行。
编辑: 使用 non-inherited 主键没有任何区别。 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();
由于缺少 CascadeOperations = CascadeOperation.All,我遇到了同样的问题。添加如下指令解决我的问题
[OneToMany(CascadeOperations = CascadeOperation.All)]