1

私は SQLite.NET と拡張機能を初めて使用します。

見つけたガイドに最善を尽くしましたが、多対多の結合テーブルにレコードが作成されず、その理由がわかりません。

SQLiteNetExtensions プロジェクトにソリューション NuGet 依存関係があります。

次のテーブルがあります。

[Table("Contact")]
public class Contact
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [MaxLength(50)]
    public string FirstName { get; set; }

    [MaxLength(50)]
    public string Surname { get; set; }

    [ManyToMany(typeof(Participant))]
    public List<Journey> Journeys { get; set; }
}

[Table("Journey")]
public class Journey
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ManyToMany(typeof(Participant))]
    public List<Contact> Contacts { get; set; }

    [ManyToMany(typeof(Waypoint))]
    public List<Location> Locations { get; set; }
}

[Table("Location")]
public class Location
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [MaxLength(50)]
    public string Name { get; set; }

    public double Latitude { get; set; }

    public double Longitude { get; set; }

    [ManyToMany(typeof(Waypoint))]
    public List<Journey> Journeys{ get; set; }
}

public class Participant
{
    [ForeignKey(typeof(Contact))]
    public int ContactId { get; set; }

    [ForeignKey(typeof(Journey))]
    public int JourneyId { get; set; }
}

public class Waypoint
{
    [ForeignKey(typeof(Location))]
    public int LocationId { get; set; }

    [ForeignKey(typeof(Journey))]
    public int JourneyId { get; set; }
}

データベースを構築するときは、次のテスト コードを使用します。

string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "xandroid.db3");

var db = new SQLiteConnection(platform, dbPath);

db.DropTable<Location>();
db.DropTable<Waypoint>();
db.DropTable<Contact>();
db.DropTable<Participant>();
db.DropTable<Journey>();

db.CreateTable<Location>();
db.CreateTable<Waypoint>();
db.CreateTable<Contact>();
db.CreateTable<Participant>();
db.CreateTable<Journey>();

Location home = new Location { Name = "Home", Latitude=22.22, Longitude=22.22 };
Location perth = new Location { Name = "Perth", Latitude = 4444.4444, Longitude = 4444.4444 };
db.InsertAll(new List<Location> { home, perth });

Contact beans = new Contact { FirstName = "Beans", Surname = "Connor" };
Contact winston = new Contact { FirstName = "Winston", Surname = "Connor" };
db.InsertAll(new List<Contact> { beans, winston });

Journey travelToPerth = new Journey { Locations = new List<Location> { perth }, Contacts = new List<Contact> { beans, winston }};
Journey returnHome = new Journey { Locations = new List<Location> { home }, Contacts = new List<Contact> { beans, winston}};
db.InsertAll(new List<Journey> { travelToPerth, returnHome } );

データにアクセスするときは、次のコードを使用します。

var waypoints = db.Table<Waypoint>();
Console.Out.WriteLine(waypoints.Count() + " recorded waypoints");

var participants = db.Table<Participant>();
Console.Out.WriteLine(participants.Count() + " recorded participants");

var journeys = db.Table<Journey>();
Console.Out.WriteLine(journeys.Count() + " recorded journeys");

その出力は次のとおりです。

0 recorded waypoints
0 recorded participants
2 recorded journeys
4

1 に答える 1

2

リレーションシップについて何も知らないプレーンな sqlite.net メソッドを使用してオブジェクトを挿入しています。リレーションシップを保存およびロードするには、SQLite-Net 拡張メソッドを使用する必要があります。ほとんどの sqlite-net メソッドには、WithChildren関係を保存するための代替手段もあります。

import SQLiteNetExtensions.Extensions;

db.InsertAllWithChildren(new List<Journey> { travelToPerth, returnHome } );

両方の要素を挿入し、必要なレコードをParticipantテーブルに挿入しWaypointて関係を保存します。

注: これにはLocationContact要素が既にデータベースに挿入されている必要があります。オブジェクトを再帰的に挿入するには、 SQLite-Net 拡張機能のドキュメントのカスケード操作セクションをご覧ください。

于 2016-04-12T09:48:58.477 に答える