【问题标题】:Can't seem to get OneToMany relation working似乎无法使 OneToMany 关系正常工作
【发布时间】:2016-11-25 20:08:26
【问题描述】:

我对移动应用程序开发非常陌生,所以我正在尝试自学。 我正在为我正在尝试制作的这个特定应用程序使用 Xamarin 和 sqlite-net(扩展)。

我有 2 个具有 OneToMany 关系的类

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 尝试了一些不同的方法,但无济于事。是我做错了什么还是我没有安装什么? 非常感谢您的帮助。

【问题讨论】:

  • 你试过WithChildren的读取方法吗?
  • 我相信UpdateWithChildren 中可能需要一个递归的第二个参数。如果不存在,您将不得不在您的 read 方法中通过 conn.GetWithChildren&lt;Player&gt;(identifier, recursive: true); 执行此操作
  • Ah GetWithChildren 确实是正确的。谢谢!!

标签: c# android xamarin sqlite-net sqlite-net-extensions


【解决方案1】:

sqlite-net extensions 的问题是,如果你想获得子关系,你不能“返回”使用常规的 sqlite-net 方法。因此,您必须在此处遵循他们的文档:

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

它们提供了诸如 GetChildren, UpdateWithChildren, etc 之类的方法,您必须在其中使用通用的 db.Table&lt;T&gt; 方法。

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

因此,您应该能够按照以下方式做一些事情:

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

否则,请阅读以上链接文档的 Cascade Operations 部分的更多信息。

【讨论】:

    猜你喜欢
    • 2019-08-15
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    • 2016-02-11
    相关资源
    最近更新 更多