Entidades Owned en Entity Framework Core

Hoy hablaremos de una propiedad que yo desconocía de su existencia completamente hasta hace poco, hablamos de la propiedad owned dentro de entity framework core. 

 

 

1 - Qué es la propiedad Owned en Entity Framework core?

 

La propiedad owned es una etiqueta que se le asigna a una entidad, la cual convierte a dicha entidad en una entidad que depende de otra completamente, ya que esta nueva entidad depende de la entidad padre. 

 

Por poner un ejemplo, imagina que tenemos usuarios y direcciones, cada usuario puede tener una única dirección por lo que tienes algo así en el código:

public class User : CursoEFBaseEntity<int>
{
    public string UserName { get; set; }
    [MaxLength(50)]
    public string Email { get; set; }
    
    public Address Address { get; set; } // 👈 this
    public virtual ICollection<Wokringexperience> Wokringexperiences { get; set; }
}

 

Puedes pensar que la propiedad Address dentro de nuestro usuario es una tabla separada dentro de la base de datos relacionada con una FK (clave foránea); Pero no. En este caso la entidad Address es possee etiqueta [Owned]:

[Owned]
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
}

 

Internamente no estamos creando una tabla en la base de datos, sino qué estaremos creando nuevas columnas dentro de la base de datos, en este caso llamadas Address_Street, Address_City, Address_PostalCode, Address_Country, etc. 

Igual que para cualquier otra propiedad, tenemos que ejecutar migraciones con dotnet ef migrations add IncludeOwnedAddress.

 

 

1.1 - Cúando utilizar (o no) la propiedad Owned?

 

El hecho de que sea una propiedad completamente dependiente de otra nos da unas pistas sobre cuándo debemos utilizarla o no. El ser dependiente significa que no podemos referenciar por ID en otra entidad, o que por ejemplo si eliminamos la entidad padre, está también se ve eliminada, básicamente porque es una parte de ella. 

 

En mi opinión, la propiedad owned viene bien utilizar únicamente cuando quieres representar valores compuestos dentro de una entidad.

 

Para el resto de casos no tiene mucho sentido, ya que no puedes (o bueno, no debes) hacer un join y no son propiedades o entidades independientes, lo que significa que no puedes hacer un DbSet<T> de la misma. 

Además una entidad owned no puede derivar de otra.

 

 

2 -  Columnas con formato JSON.

 

Si estamos diciendo que la idea es agrupar múltiples propiedades en un objeto, porque no hacer lo mismo en la base de datos y leer directamente un Json? 

 

Desde .NET 9 podemos hacerlo, únicamente debemos indicarlo en el OnModelCreating de nuestro DbContext:

 

modelBuilder.Entity<User>()
    .OwnsOne<Address>(user=>user.Address)
    .ToJson();

 

Ojo, Si tienes las Data Seeds antiguas, donde utilizabamos HasData, desde .NET 9 hay una nueva forma, porque HasData no es compatible con la columna de formato Json. Así que en ese post está explicado el cómo hacerlo.

 

Alternativamente si únicamente queremos un JSON donde guardar los resultados como texto plano, podemos guardarlo como texto y crear la conversión dentro de EF:

builder.Property(u => u.Address)
    .HasConversion(
        v => JsonConvert.SerializeObject(v),
        v => JsonConvert.DeserializeObject<Address>(v));

Aunque para esto no necesitas owned y además pierdes las ventajas de consultar dentro de la propia columna. En verdad esta parte no tiene NADA que ver con owned, pero es una práctica común y por eso he considerado el explicarla. 

 

 

2.1 - Consultas en Campos JSON

 

La propiedad owned nos permite realizar consultas utilizando LINQ, que el propio código transformará en SQL. 

 

Por ejemplo en el siguiente código:

List<User> dublinUsers = await Entities
   .Where(a => a.Address.City == "Dublin")
   .ToListAsync()

 

Entity framework traduce la comparación a JSON_VALUE(...) = ‘Dublin’; Lo cual, como te puedes imaginar no es muy eficiente, por lo que si tienes que realizar este tipo de consultas muy frecuentemente la recomendación es que no hagas esa columna un JSON, en cambio, si la búsqueda va a ser una excepción no debería ser ningún problema. 

 

Conclusión

 

La propiedad Owned nos permite tener objetos (o value objects) dentro de entidades de Entity Framework sin necesidad de crear una tabla para ellos. Esto son datos que no tienen identidad propia y viven y mueren con la entidad padre. 

 

Tenemos dos opciones, crear columnas planas o una columna Json, la decisión de cual utilizar deberá radicar en si vamos a realizar consultas o no, y cuántas, para siempre priorizar el rendimiento. 

 

Finalmente antes de complicar tu modelo, piensa si de verdad necesitas un objeto complejo o si dos o tres columnas “normales” sirven igual. 

 

© copyright 2025 NetMentor | Todos los derechos reservados | RSS Feed

Buy me a coffee Invitame a un café