2016-01-20 23 views
3

我試圖使用SQLite網絡擴展做了筆記應用程序爲遊戲,它採用3層模型,Game [1 has many *] Character [1 has many *] Note [1 applies to *] CharacterSQLite的網絡擴展一對多關係不插入/省電/更新兒童

我使用Xamarin Visual Studio Community 2015,並使用NuGet包管理器安裝SQLiteNetExtensions。

我還沒有過去遊戲和角色之間的第一級關係,並且插入到數據庫中(無論是通過初始插入然後更新,還是遞歸地使用InsertWithChildren)都不會更新Game對象中的角色。它只會導致GameModel中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.CharacterstestCharacter.Game

+0

作爲Abstract基礎模型的一部分,所有主鍵都是擴展類中的屬性'''Id'''。 –

+0

我不確定繼承PK是否有效。我也懷疑它有價值。 – NoChance

+0

如果沒有它,Xamarin教程會使用繼承的PK: http://developer.xamarin.com/guides/cross-platform/application_fundamentals/data/part_3_using_sqlite_orm/ –

回答

2

SQLite-Net擴展擴展SQLite.Net與其他方法加載和寫入關係。您正在使用UpdateWithChildren方法編寫與數據庫的關係,但是您沒有加載數據庫中的關係,因爲GetAll是純SQLite.Net方法。

嘗試使用任何*WithChildren變種SQLite.Net方法,例如:

var testGame = database.GetAllWithChildren<GameModel>().FirstOrDefault(); 

或:

var testGame = database.GetWithChildren<GameModel>(game.Id); 

或者,你可以調用加載方法GetChildren已有對象的關係:

var testGame = database.GetAll<GameModel>().FirstOrDefault(); 
testGame.GetChildren(); 
+0

現貨。它正在工作。使用此錯誤切換方法後,我遇到了一個小問題:https://bugzilla.xamarin.com/show_bug.cgi?id=32622解決方案在那裏工作並解決了問題。 –

0

由於想念我有同樣的問題g CascadeOperations = CascadeOperation.All。添加說明如下解決我的問題

[OneToMany(CascadeOperations = CascadeOperation.All)]