Visual Studio 2015のXamarin.AndroidプロジェクトにSQLite-Net Extensionsパッケージをインストールしました。 Person
とEvent
エンティティ間の多対多の関係。私は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
を割り当てますPerson
とUpdateWithChildren
方法使用して再度保存: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は自動的に何らかの形でそれを作成すべきですか?
この行を追加すると、event1
とperson1
の最初の2つの挿入が正しく機能しています(両方のエンティティを挿入した後にIDが割り当てられている)。
しかし、「反対の実体」、event1
はそのParticipants
コレクション(Person
の一覧)NULL
あり、この場合には:
をperson1
上Events
コレクションでもEvent
も同上のセットを持っている、作成しました
私はすべてを試みましたが、何も動作していません。私はSQLite-Net Extensionsのドキュメントを読んで理解しているので、自動的に解決する必要があります。私もこのコレクションにCascadeOperations = CascadeOperation.All
を追加しましたが、それはあなたが見ることができません。私はまだ何か間違っていますか?
DBから人やイベントを受け取ったらどうなりますか? –
@ShawnKendrot私は、Person:db.Get(1)を使って投稿したコードの後にエンティティを取得しようとしましたが、両方のコレクション( 'Person'の' Events'と 'Event'の' Participants' ')は' NULL'です。 –
DawidSibinski
@ShawnKendrot私は試しましたが、何も変わりません。私は 'db.InsertWithChildren(person1)'を使って1つの操作を試みましたが(前の2つの個別の 'Insert'sを除いて)、何も変わりません。 – DawidSibinski