Overview
埋め込みオブジェクトは、特定のオブジェクトに関する複雑なデータをモデル化する特殊なタイプのRealm オブジェクトです。 埋め込みオブジェクトは関係と似ていますが、追加の制約が付与され、非正規化された MongoDB document modelにより自然にマップされます。
Realm は、各埋め込みオブジェクトを単一の特定の親オブジェクト内のネストされたデータとして扱う一意の所有権の制約を強制します。 埋め込みオブジェクトは親オブジェクトのライフサイクルを継承し、独立した Realm オブジェクトとして存在することはできません。 Realm は、親オブジェクトが削除された場合、または新しい埋め込みオブジェクト インスタンスによって上書きされた場合に、埋め込みオブジェクトを自動的に削除します。
注意
Realm は埋め込みオブジェクトに段階的な削除を使用する
Realm オブジェクトを削除すると、そのオブジェクトが参照するすべての埋め込みオブジェクトが Realm によって自動的に削除されます。 親オブジェクトを削除した後にアプリケーションが保持する必要があるオブジェクトは、代わりに関係を使用する必要があります。
埋め込みオブジェクトデータモデル
Realm オブジェクトモデルまたは サーバー側のドキュメントスキーマを使用して埋め込みオブジェクトタイプを定義できます。埋め込みオブジェクトタイプは再利用可能であり、構成も可能です 。複数の親オブジェクトタイプで同じ埋め込みオブジェクトタイプを使用でき、オブジェクトを他の埋め込みオブジェクト内に埋め込むことができます。
重要
埋め込みオブジェクトにはプライマリキーを設定できません。
Realm オブジェクトモデル
埋め込みオブジェクトを定義するには、 IEmbeddedObjectインターフェースを実装します。 関係を定義するのと同じ方法で、親オブジェクトタイプから埋め込みオブジェクトタイプを参照できます。
Addressが埋め込みオブジェクトである次の例を考えてみます。 ContactBusinessクラスと クラスはどちらもAddress を埋め込みオブジェクトとして参照します。
public partial class Address : IEmbeddedObject { [] public string Street { get; set; } [] public string City { get; set; } [] public string Country { get; set; } [] public string PostalCode { get; set; } } public partial class Contact : IRealmObject { [] [] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); [] public string Partition { get; set; } [] public string Name { get; set; } [] public Address? Address { get; set; } // embed a single address } public partial class Business : IRealmObject { [] [] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); [] public string Partition { get; set; } [] public string Name { get; set; } [] public IList<Address> Addresses { get; } }
JSON Schema
埋め込みオブジェクトは、親型のスキーマ内の埋め込みドキュメントにマップされます。 この動作は、独自の MongoDB コレクションにマップされる通常の Realm オブジェクトとは異なります。
{ "title": "Contact", "bsonType": "object", "required": ["_id"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "address": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } }
{ "title": "Business", "bsonType": "object", "required": ["_id", "name"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "addresses": { "bsonType": "array", "items": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } } }
埋め込みオブジェクトの読み取りと書込み
埋め込みオブジェクトの作成
埋め込みオブジェクトを作成するには、埋め込みオブジェクトの インスタンスを親オブジェクトの プロパティに割り当てます。
var address = new Address() // Create an Address { Street = "123 Fake St.", City = "Springfield", Country = "USA", PostalCode = "90710" }; var contact = new Contact() // Create a Contact { Name = "Nick Riviera", Address = address // Embed the Address Object }; realm.Write(() => { realm.Add(contact); });
埋め込みオブジェクト プロパティの更新
埋め込みオブジェクト内のプロパティを更新するには、書込みトランザクション内のプロパティを変更します。
var resultContact = realm.All<Contact>() // Find the First Contact (Sorted By Name) .OrderBy(c => c.Name) .FirstOrDefault(); // Update the Result Contact's Embedded Address Object's Properties realm.Write(() => { resultContact.Address.Street = "Hollywood Upstairs Medical College"; resultContact.Address.City = "Los Angeles"; resultContact.Address.PostalCode = "90210"; });
埋め込みオブジェクトの上書き
埋め込みオブジェクトを上書きするには、書込みトランザクション(write transaction)でパーティの埋め込みオブジェクト プロパティを新しい インスタンスに再割り当てします。
var oldContact = realm.All<Contact>() // Find the first contact .OrderBy(c => c.Name) .FirstOrDefault(); var newAddress = new Address() // Create an Address { Street = "100 Main Street", City = "Los Angeles", Country = "USA", PostalCode = "90210" }; realm.Write(() => { oldContact.Address = newAddress; });
埋め込みオブジェクト プロパティに対するコレクションのクエリ
ドット表記 を使用して、埋め込みオブジェクト プロパティ値に基づいてオブジェクトのコレクションをフィルタリングまたはソートする:
注意
埋め込みオブジェクトを直接クエリすることはできません。 代わりに、親オブジェクトタイプに対するクエリを介して埋め込みオブジェクトにアクセスします。
// Find All Contacts with an Address of "Los Angeles" var losAngelesContacts = realm.All<Contact>() .Filter("address.city == 'Los Angeles'"); foreach (var contact in losAngelesContacts) { Console.WriteLine("Los Angeles Contact:"); Console.WriteLine(contact.Name); Console.WriteLine(contact.Address.Street); }