3

Visual Studio 2015のXamarin.AndroidプロジェクトにSQLite-Net Extensionsパッケージをインストールしました。 PersonEventエンティティ間の多対多の関係。私はthe official documentation of the libraryに続きましたが、私はそれを働かせることはできません。私が作成したXamarin.Android:SQLite-Net Extension多対多 - そのようなテーブル、NULLコレクションなし

クラス:

Person.cs:

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

    public string Name { get; set; } 

    public string LastName { get; set; } 

    public string PhoneNumber { get; set; } 

    public string Email { get; set; } 

    [ManyToMany(typeof(PersonEvent), CascadeOperations = CascadeOperation.All)] 
    public List<Event> Events { get; set; } 
} 

Event.cs:

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

    public string Name { get; set; } 
    public DateTime Date { get; set; } 
    public string Place { get; set; } 

    [ManyToMany(typeof(PersonEvent), CascadeOperations = CascadeOperation.All)] 
    public List<Person> Participants { get; set; } 
} 

PersonEvent.cs:

それをテストする
public class PersonEvent 
{ 
    [ForeignKey(typeof(Person))] 
    public int PersonId { get; set; } 

    [ForeignKey(typeof(Event))] 
    public int EventId { get; set; } 
} 

、私はきれいな1はデバイス上に作成し、その後Personを作成しようとしていることを確認するため、データベースファイルを削除しています、Event、最初のDBに両方を挿入し、その後にEventを割り当てますPersonUpdateWithChildren方法使用して再度保存:SQLite.Net.SQLiteException: no such table: PersonEvent、しかし私は私がする必要はありませんと思った:それは存在していなかった場合、私は例外を取得したため

var dbFile = new File(Constants.DbFilePath); 
dbFile.Delete(); 

var db = new SQLiteConnection(new SQLitePlatformAndroid(), Constants.DbFilePath); 
db.CreateTable<Person>(); 
db.CreateTable<Event>(); 
db.CreateTable<PersonEvent>(); 

var event1 = new Event 
{ 
    Name = "Volleyball", 
    Date = new DateTime(2017, 06, 18), 
    Place = "Sports hall" 
}; 

var person1 = new Person 
{ 
    Name = "A", 
    LastName = "B", 
    PhoneNumber = "123456789" 
}; 


db.Insert(person1); 
db.Insert(event1); 
person1.Events = new List<Event> { event1 }; 
db.UpdateWithChildren(person1); 

まず第一に、私はCreateTable<PersonEvent>()行を追加する必要がこの中間テーブルを手動で作成します。 SQLite-Net Extensionsは自動的に何らかの形でそれを作成すべきですか?

この行を追加すると、event1person1の最初の2つの挿入が正しく機能しています(両方のエンティティを挿入した後にIDが割り当てられている)。 enter image description here

しかし、「反対の実体」、event1はそのParticipantsコレクション(Personの一覧)NULLあり、この場合には:

person1EventsコレクションでもEventも同上のセットを持っている、作成しましたenter image description here

私はすべてを試みましたが、何も動作していません。私はSQLite-Net Extensionsのドキュメントを読んで理解しているので、自動的に解決する必要があります。私もこのコレクションにCascadeOperations = CascadeOperation.Allを追加しましたが、それはあなたが見ることができません。私はまだ何か間違っていますか?

+0

DBから人やイベントを受け取ったらどうなりますか? –

+0

@ShawnKendrot私は、Person:db.Get (1)を使って投稿したコードの後に​​エンティティを取得しようとしましたが、両方のコレクション( 'Person'の' Events'と 'Event'の' Participants' ')は' NULL'です。 – DawidSibinski

+0

@ShawnKendrot私は試しましたが、何も変わりません。私は 'db.InsertWithChildren(person1)'を使って1つの操作を試みましたが(前の2つの個別の 'Insert'sを除いて)、何も変わりません。 – DawidSibinski

答えて

2

PERSON1上のイベントのコレクションもIdがあなたのperson1オブジェクトが作成したイベントのリストを持っている

を設定している作成してもイベントを、持っています。コレクションには、作成したevent1オブジェクトへのリンクが含まれていました。このイベント収集は、データベースの挿入または更新時には更新されませんでした。リストに同じオブジェクトが含まれているため、イベントオブジェクトのIDオブジェクトはデータベースに挿入するときに設定されています。

SQLite-NET拡張機能は、(Entity Frameworkのような)[自動]遅延ロードソリューションではありません。それは、それが指示されたときにのみオブジェクトを取得します。Getメソッドを使用してデータベースからオブジェクトを取得しても、SQLiteとは何も変わりません。これは、SQLite-NET Extensionsがそのメソッドを変更しないためです。しかし、それはGetWithChildrenFindWithChildrenのような新しいメソッドを提供します。オブジェクトの子を取得したい場合は、SQLite-NET Extensionsが提供するメソッドが必要です。提供

サンプルは、同様にこれらのメソッドを使用します。あなたはまた、オブジェクトを再帰的に人-イベントパーソン・イベントなどからロードしたいとは思わないでしょう

// Get the object and the relationships 
var storedValuation = db.GetWithChildren<Valuation>(valuation.Id); 
if (euro.Symbol.Equals(storedValuation.Stock.Symbol)) { 
    Debug.WriteLine("Object and relationships loaded correctly!"); 
} 

。これは決して終わらないでしょう。あなたが人で始まっていて、イベントに関連するすべての人を取得したいのであれば、それらを別のコールに入れたいと思うでしょう。

var person = db.GetWithChildren(1); 
foreach(var event in person.Events) 
{ 
    // lazy load ourselves 
    var allParticipants = db.GetWithChildren(event.Id).Participants; 
} 

希望誰も@Shawn Kendrotによってここで提供するヒントやソリューションを含む、SQLiteの-Netの拡張ライブラリを使用して多対多の関係を作成する上での詳細を見たい場合は、私は」

+0

ありがとうございます。しかし、ほとんどのデベロッパーがモバイルアプリのデータベースでこうした関係をどのように認識しているのだろうか? SQLite以外のDBを使用していますか?私はそれが最も使いやすいことを発見しましたが、アプリのデータを永続的に保存する方が良いでしょうか? – DawidSibinski

+0

データベースに関しては、SQLiteが最も多く使われていると思います。 –

+0

Xamarin.AndroidアプリでもEntity Framework(Core)をSQLiteで使用できるようになりました.- https://blog.xamarin.com/building-android -apps-with-entity-framework /を使用します。私はそれを試してみる必要があります。 – DawidSibinski

関連する問題