¿Propiedad de navegación EF Core para unir exteriormente a la izquierda?
Tengo dos tablas en SQL. Una de ellas se llama “Users” que contiene información del usuario, y la otra se llama “UserDefaultSources” que contiene fuentes de pagos predeterminadas (tokens). No todos los usuarios tienen un “UserDefaultSource”, sin embargo, la columna “AccountId” es requerida en la tabla de usuarios y es la clave primaria en la tabla de UserDefaultSources.
Me gustaría crear una propiedad de navegación donde puedo .Include el UserDefaultSource, el cual llenaría la propiedad UserDefaultSource del objeto de usuario cuando exista en esa tabla.
Este es el código SQL que utilizo actualmente para consultar estas tablas de la manera que describo arriba.
SELECT usr.UserId,
uds.AccountId,
usr.FirstName,
usr.LastName
FROM dbo.Users usr (NOLOCK)
LEFT OUTER JOIN dbo.UserDefaultSources uds (NOLOCK)
ON uds.AccountId = usr.AccountId;
Cuando ejecuto este código en SSMS, obtengo lo siguiente:
Observe que la columna AccountId es nula en las filas donde no existe un UserDefaultSource para ese usuario.
En mi proyecto de .NET 6 con EF Core 6, estoy tratando de crear dos entidades para estas tablas y luego consultar al usuario para incluir UserDefaultSource como una propiedad de navegación de la siguiente manera.
User user = await dbContext.Users
.Include(v => v.Region)
.Include(v => v.Country)
.Include(v => v.Gender)
.Include(v => v.UserDefaultSource)
.FirstOrDefaultAsync(v => v.UserId == userId);
Esto funciona perfectamente para las otras entidades asociadas (Región, País, Género) porque es una relación uno a uno. ¿Cómo puedo hacer que EF Core .Include la UserDefaultSource cuando existe un registro coincidente en la tabla de UserDefaultSources?
davy.ai
Para incluir la propiedad de navegación
UserDefaultSource
para la entidadUser
en EF Core 6, puedes definir la relación entre las dos tablas utilizando la API fluida en tu clase DbContext de la siguiente manera:En el código anterior, estamos definiendo una relación uno a uno entre la entidad
User
y la entidadUserDefaultSource
utilizando el métodoHasOne
. Luego, usamos el métodoWithOne
para indicar que la relación es requerida desde el ladoUserDefaultSource
. Finalmente, especificamos la propiedad de clave foránea utilizando el métodoHasForeignKey
.Una vez que hayas definido la relación, puedes usar el método
Include
para cargar con anticipación la propiedad de navegaciónUserDefaultSource
de la siguiente manera:Aquí, estamos cargando la entidad
User
e incluyendo sus entidades asociadasRegion
,Country
,Gender
yUserDefaultSource
utilizando el métodoInclude
. La entidadUserDefaultSource
se poblara con datos si existe un registro que coincida en la tablaUserDefaultSources
, de lo contrario, será nula.