Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

Relacionamentos - .NET SDK

Nesta página

  • Definir uma propriedade de relacionamento
  • Relacionamento para um
  • Relacionamento com muitos
  • Relacionamento inverso
  • Resumo

O Realm permite definir relacionamentos explícitos entre os tipos de objeto em um aplicativo. Um relacionamento é uma propriedade de objeto que faz referência a outro objeto do Realm em vez de um dos tipos de dados primitivos. Você define relacionamentos definindo o tipo de propriedade para outra classe Realm.

Importante

Herança

Todos os objetos do Realm herdam a partir da interface IRealmObject, IEmbeddedObject ou IAsymmetricObject e devem ser declarados partial classes.

Em versões do .NET SDK anteriores a 10.18.0, objetos derivam das classes de base RealmObject, EmbeddedObject ou AsymmetricObject . Essa abordagem para a definição do modelo Realm ainda é suportada, mas não inclui novos recursos, como as anotações de nulidade. Em uma futura versão do SDK, as classes básicas se tornarão obsoletas. Você deve usar as interfaces para quaisquer novas classes que escrever e deve considerar a migração das suas classes existentes.

Relacionamentos são referências diretas a outros objetos em um realm, o que significa que você não precisa de tabelas de ponte ou junções explícitas para definir um relacionamento como faria em um banco de dados relacional. Em vez disso, você pode acessar objetos relacionados lendo e escrevendo na propriedade que define o relacionamento. O Realm executa operações de leitura lentamente à medida que elas entram, portanto, consultar um relacionamento é tão eficiente quanto ler uma propriedade regular.

Dica

Veja também:

Como alternativa, você pode definir seus relacionamentos no App Services App.

Existem três tipos principais de relacionamentos entre objetos:

Uma relação um-para-um significa que um objeto está relacionado de uma forma específica a não mais do que um outro objeto. Você define esse relacionamento para um tipo de objeto em seu esquema de objetos especificando uma propriedade onde o tipo é o tipo de objeto de Realm relacionado.

Exemplo

Um aplicativo pode usar os seguintes esquemas de objeto para indicar que uma Pessoa pode ou não possuir um único Cão, incluindo-o em sua propriedade dog :

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string Name { get; set; }
public DateTimeOffset Birthdate { get; set; }
public Dog? Dog { get; set; }
}
public partial class Dog : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Breed { get; set; } = String.Empty;
}

Para consultar um relacionamento direto, você pode usar a sintaxe LINQ. Consulte o exemplo a seguir para saber como consultar um relacionamento um-para-um:

var fidosPerson = realm.All<Person>().FirstOrDefault(p => p.Dog == dog);

Uma relação para muitos significa que um objeto está relacionado de uma maneira específica a vários objetos. Você define esse relacionamento para um tipo de objeto especificando uma propriedade em que o tipo é um IList<T> do tipo de objeto de Realm relacionado. Defina o IList<T> apenas com um getter. Você não precisa inicializá-lo no construtor, pois o Realm gerará uma instância de collection na primeira vez que a propriedade for acessada:

// To add items to the IList<T>:
var person = new Person();
person.Dogs.Add(new Dog
{
Name = "Caleb",
Age = 7,
Breed = "mutt"
});

Exemplo

Um aplicativo pode usar os seguintes esquemas de objetos para indicar que uma pessoa pode possuir vários cães, incluindo-os em sua propriedade dog:

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string Name { get; set; }
public DateTimeOffset Birthdate { get; set; }
public IList<Dog> Dogs { get; }
}
public partial class Dog : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Breed { get; set; } = String.Empty;
}

Para ver a relação entre Pessoa e Cão, consulte a Pessoa e obtenha os Cães dessa pessoa:

var katieAndHerDogs = realm.All<Person>().
Where(p => p.Name == "Katie")
.FirstOrDefault();

Um relacionamento inverso vincula um objeto a qualquer outro objeto que se refira a ele em um relacionamento definido como um-para-um ou um-para-muitos. As definições de relacionamento são unidirecionais, então você deve definir explicitamente uma propriedade no modelo do objeto como um relacionamento inverso.

Por exemplo, o relacionamento "um usuário tem muitos itens" não cria automaticamente o relacionamento inverso "um item pertence a um usuário". Se você não especificar o relacionamento inverso no modelo de objetos, você precisará executar uma query separada para procurar o usuário que é atribuído a um determinado item.

Para definir o relacionamento inverso, defina uma propriedade IQueryable<T> somente de início em seu modelo de objetos, onde T é o tipo de origem do relacionamento, e depois anote essa propriedade com um atributo [Backlink(sourceProperty)] , onde "sourceProperty" é o nome da propriedade no outro lado do relacionamento. O exemplo a seguir mostra como fazer isso com o cenário "O usuário tem muitos itens":

public partial class User : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
public string Name { get; set; }
[Backlink(nameof(Item.Assignee))]
public IQueryable<Item> Items { get; }
}
public partial class Item : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
public string Text { get; set; }
public User? Assignee { get; set; }
}

Neste exemplo, observe que:

  • A propriedade Assignee do objeto do item é um objeto do usuário.

  • A propriedade Items do objeto do usuário inverte o relacionamento e se refere a todos os objetos do item que contêm este usuário específico em sua propriedade Assignee.

Isso, então, nos permite consultar a collection Item para obter todos os itens atribuídos a um usuário específico.

Para consultar o relacionamento inverso, você não pode usar o Linq. Em vez disso, passe um predicado de string. O exemplo a seguir mostra como você pode encontrar todos os usuários que têm itens que contêm a palavra "oscilador":

var oscillatorAssignees = realm.All<User>()
.Filter("Items.Text CONTAINS 'oscillator'").ToList();
foreach (User u in oscillatorAssignees)
{
Console.WriteLine(u.Name);
}
  • Um relacionamento é uma propriedade de objeto que permite que um objeto faça referência a outros objetos do mesmo tipo de objeto ou de outro.

  • Relacionamentos são referências diretas. Você pode acessar objetos relacionados diretamente por meio de uma propriedade de relacionamento sem escrever nenhum tipo de associação.

  • O Realm oferece suporte a relacionamentos um-para-um, um-para-muitos e inversos.

Voltar

Definir manualmente um esquema

Próximo

Alterar um modelo de objeto