Visão geral
Um objeto incorporado é um tipo especial de Objeto de Realm que modela dados complexos a respeito de um objeto específico. Os objetos incorporados são semelhantes às relações, mas fornecem restrições adicionais e mapeiam mais naturalmente o do MongoDB document model.
O Realm impõe restrições de propriedade exclusivas que tratam cada objeto incorporado como dados aninhados dentro de um único objeto pai específico. Um objeto incorporado herda o ciclo de vida de seu objeto pai e não pode existir como um objeto de Realm independente. O Realm exclui automaticamente objetos incorporados se seu objeto pai for excluído ou quando substituído por uma nova instância de objeto incorporado.
Observação
O Realm usa exclusões em cascata para objetos embarcados
Quando você exclui um objeto de Realm, o Realm exclui automaticamente quaisquer objetos incorporados referenciados por esse objeto. Qualquer objeto que seu aplicativo precise manter após a exclusão de seu objeto pai deve usar relacionamentos.
Modelos de dados de objetos incorporados
Você pode definir tipos de objeto incorporado usando modelos de Objeto de Realm ou um esquema de documento do lado do servidor. Os tipos de objeto embarcados são reutilizáveis e componíveis . Você pode usar o mesmo tipo de objeto incorporado em vários tipos de objeto pai e pode incorporar objetos dentro de outros objetos incorporados.
Importante
Objetos incorporados não podem ter uma chave primária.
Realm Object Models
Para definir um objeto embarcado, implemente a interface do IEmbeddedObject. Você pode referenciar um tipo de objeto embarcado a partir de tipos de objeto principal da mesma maneira que definiria um relacionamento:
Considere o seguinte exemplo onde o Address é um objeto embarcado. Tanto a classe Contact quanto a Business fazem referência à Address como um objeto embarcado:
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
Objetos incorporados são mapeados para documentos incorporados no esquema do tipo principal. Este comportamento difere dos objetos regulares do Realm, que mapeiam para sua própria coleção MongoDB.
{ "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" } } } } } }
Ler e escrever objetos incorporados
Criar um Objeto Embarcado
Para criar um objeto embarcado, atribua uma instância do objeto embarcado à propriedade de um objeto pai:
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); });
Atualizar uma propriedade de objeto incorporado
Para atualizar uma propriedade em um objeto integrado, modifique a propriedade em uma transação de escrita:
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"; });
Substituir um Objeto Integrado
Para substituir um objeto integrado, reatribua a propriedade do objeto integrado de uma parte a uma nova instância em uma transação de escrita:
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; });
Consultar uma Coleção sobre Propriedades de Objetos Embarcados
Use a notação de ponto para filtrar ou classificar uma coleção de objetos com base em um valor de propriedade de objeto incorporado:
Observação
Não é possível consultar objetos incorporados diretamente. Em vez disso, acesse objetos incorporados por meio de uma consulta para o tipo de objeto pai.
// 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); }