Docs Menu
Docs Home
/ /
Datos del modelo

Relaciones - SDK .NET

Realm permite definir relaciones explícitas entre los tipos de objetos de una aplicación. Una relación es una propiedad de un objeto que hace referencia a otro objeto de Realm, en lugar de a uno de los tipos de datos primitivos. Las relaciones se definen asignando el tipo de propiedad a otra clase de Realm.

Importante

Herencia

Todos los objetos de Realm heredan del Interfaz IRealmObject, IEmbeddedObject o IAsymmetricObject y debe declararse partial clases.

En versiones del SDK de .NET anteriores 10.18.0 a, los objetos derivan de las clases base RealmObject, EmbeddedObject o AsymmetricObject. Este enfoque para la definición del modelo Realm aún se admite, pero no incluye nuevas funciones como las anotaciones de nulabilidad. En una futura versión del SDK, las clases base quedarán obsoletas. Debe usar las interfaces para cualquier clase nueva que escriba y considerar la migración de las clases existentes.

Las relaciones son referencias directas a otros objetos de un dominio, lo que significa que no se necesitan tablas puente ni uniones explícitas para definir una relación como en una base de datos relacional. En su lugar, se puede acceder a los objetos relacionados leyendo y escribiendo en la propiedad que define la relación. Realm ejecuta las operaciones de lectura de forma diferida a medida que llegan, por lo que consultar una relación es tan eficiente como leer una propiedad normal.

Tip

Alternativamente, puede definir sus relaciones en su aplicación App Services.

Hay tres tipos principales de relaciones entre objetos:

Una relación de uno a uno significa que un objeto está relacionado de una manera específica con solo otro objeto. Se define una relación de uno a uno para un tipo de objeto en su esquema de objeto especificando una propiedad donde el tipo es el tipo de objeto de dominio relacionado.

Ejemplo

Una aplicación podría utilizar los siguientes esquemas de objetos para indicar que una Persona puede o no poseer un solo Perro incluyéndolo en su propiedad 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 una relación directa, puede usar la sintaxis LINQ. Vea el siguiente ejemplo para saber cómo consultar una relación uno a uno:

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

Una relación de varios objetos significa que un objeto está relacionado de una manera específica con varios objetos. Se define una relación de varios objetos para un tipo de objeto especificando una propiedad donde el tipo es un IList<T> del tipo de objeto de Realm relacionado. Defina el IList<T> con solo un getter. No es necesario inicializarlo en el constructor, ya que Realm generará una instancia de colección la primera vez que se acceda a la propiedad:

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

Ejemplo

Una aplicación podría utilizar los siguientes esquemas de objetos para indicar que una Persona puede poseer varios Perros incluyéndolos en su propiedad 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 la relación de muchos entre Persona y Perro, consulta la Persona y obtiene los Perros de esa persona:

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

Una relación inversa vincula un objeto con cualquier otro objeto que haga referencia a él en una relación definida de uno a muchos. Las definiciones de relación son unidireccionales, por lo que debe definir explícitamente una propiedad en el modelo del objeto como una relación inversa.

Por ejemplo, la relación "a muchos" "un usuario tiene muchos elementos" no crea automáticamente la relación inversa "un elemento pertenece a un usuario". Si no se especifica la relación inversa en el modelo de objetos, se debe ejecutar una consulta independiente para buscar el usuario asignado a un elemento determinado.

Para definir la relación inversa, defina una IQueryable<T> propiedad solo para captadores en su modelo de objetos, donde T es el tipo de origen de la relación, y luego anote esta propiedad con un atributo [Backlink(sourceProperty)], donde "sourceProperty" es el nombre de la propiedad en el otro lado de la relación. El siguiente ejemplo muestra cómo hacerlo en el escenario "El usuario tiene muchos elementos":

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; }
}

En este ejemplo, tenga en cuenta que:

  • La propiedad Assignee del objeto Item es un objeto User.

  • La propiedad Items del objeto Usuario invierte la relación y hace referencia a todos los objetos Elemento que contienen este Usuario específico en su propiedad Assignee.

Esto, entonces, nos permite consultar la colección de elementos para obtener todos los elementos asignados a un usuario específico.

Para consultar la relación inversa, no se puede usar Linq. En su lugar, se pasa un predicado de cadena. El siguiente ejemplo muestra cómo encontrar todos los usuarios con elementos que contienen la palabra "oscilador":

var oscillatorAssignees = realm.All<User>()
.Filter("Items.Text CONTAINS 'oscillator'").ToList();
foreach (User u in oscillatorAssignees)
{
Console.WriteLine(u.Name);
}
  • Una relación es una propiedad de un objeto que permite que un objeto haga referencia a otros objetos del mismo tipo o de otro tipo.

  • Las relaciones son referencias directas. Se puede acceder a objetos relacionados directamente mediante una propiedad de relación sin necesidad de escribir ningún tipo de unión.

  • Realm admite relaciones de uno a muchos e inversas.

Volver

Definir manualmente un esquema

En esta página