2016-01-20 7 views
3

Я пытаюсь использовать SQLite Net Extensions делать заметки приложения для игр, он использует 3 слой модели, Game [1 has many *] Character [1 has many *] Note [1 applies to *] CharacterSQLite Net Extensions OneToMany отношение не вставляя/сохранение/обновление Детей

Я использую Xamarin в Visual Studio Community 2015 и установленных SQLiteNetExtensions с помощью диспетчера пакетов NuGet.

Я еще не прошел первый уровень отношений между игрой и персонажем, а вставка в базу данных (будь то через начальную вставку, а затем обновление или с использованием рекурсивного метода 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; } 
} 

Character Модель

[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. 

Я нахожусь в недоумении, где начать сортировку этого и будет признателен за помощь в его запуске и запуске.


Edit: Использование Ненаследуемые первичного ключа не сделал никакой разницы. Все еще нет данных в testGame.Characters или testCharacter.Game

+0

В рамках базовой модели абстрактного выражения все первичные ключи являются свойством '' 'Id''' в расширенном классе. –

+0

Я не уверен, работает ли наследование ПК или нет. Я также сомневаюсь, что это имеет ценность. – NoChance

+0

Я посмотрю, будет ли это работать без него, учебник Xamarin использует унаследованный ПК: 10 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

У меня была такая же проблема из-за missin g CascadeOperations = CascadeOperation.All. Добавьте инструкцию, как показано ниже, разрешите мою проблему.

[OneToMany(CascadeOperations = CascadeOperation.All)]