似乎无法获得OneToMany关系工作

问题描述:

我对移动应用程序开发非常陌生,所以我试图教自己。 我正在使用Xamarin和sqlite-net(扩展)为这个特定的应用程序,我试图使。似乎无法获得OneToMany关系工作

我有2个班级,一对多的关系

class Game 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [OneToMany(CascadeOperations = CascadeOperation.All)] 
    public List<Player> Players { get; set; } 

    public Game() 
    { 
     Players = new List<Player>(); 
    } 
} 

class Player 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id { get; set; } 
    [MaxLength(8)] 
    public string Name { get; set; } 

    [ForeignKey(typeof(Game))] 
    public int GameId { get; set; } 

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

} 

现在在我的活动我有这样的事情

 SQLiteConnection db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), path); 

     db.CreateTable<Player>(); 
     db.CreateTable<Game>(); 

     Game game = new Game(); 
     game.Name = "Stupid game"; 

     Game game2 = new Game(); 
     game2.Name = "Fun game"; 

     Game game3 = new Game(); 
     game3.Name = "Amazing game"; 

     db.Insert(game); 
     db.Insert(game2); 
     db.Insert(game3); 

     Player player = new Player(); 
     player.Name = name; //Getting this from a input field 
     db.Insert(player); 

     Random random = new Random();      
     player.GameId = random.Next(1, 3); 
     Game game = db.Get<Game>(player.GameId); 
     player.Game = game; 

     db.UpdateWithChildren(player); 

     game.Players.Add(player); 
     db.UpdateWithChildren(game); 

这一切似乎工作,并没有给我的错误。当我调试这个时,我可以看到玩家确实添加了一个游戏。然而,当我尝试别的地方使用下面的语句获取所有的球员,

List<Player> players = db.Table<Player>().ToList(); 

他们突然没有了游戏,我的程序崩溃时,我尝试读取该属性。

我已经尝试了一些与UpdateWithChildren和InsertWithChildren不同的东西,但无济于事。有什么我做错了,还是我没有安装或? 我真的很感谢帮助。

+1

你有没有试过'WithChildren'的读法? – redent84

+1

我相信''UpdateWithChildren'中可能需要递归的第二个参数。如果不存在,你必须通过''read''方法通过'conn.GetWithChildren (identifier,recursive:true);' –

+0

Ah GetWithChildren确实是正确的。谢谢!! – Jinse

关于sqlite-net extensions的事情是,如果您想获得儿童关系,则不能返回到使用常规sqlite-net方法。因此,你必须在这里跟随他们的文档:

https://bitbucket.org/twincoders/sqlite-net-extensions

他们提供的方法,如在GetChildren, UpdateWithChildren, etc,你将不得不在通用db.Table<T>方法来使用。

如果您决定使用递归方法,请务必提供可选的recursive参数。

因此,你应该能够沿着线做一些事情:

conn.GetWithChildren<Player>(identifier, recursive: true) 

更否则读了上面链接的文档的Cascade Operations部分。