Tengo un problema interesante que resolver, pero, aunque es común, parece que no se puede lograr fácilmente con Entity Framework. Hay dos tablas:Entity Framework - Propiedad de solo lectura de la entidad asignada a una columna de la tabla relacionada
Player(Id,TeamId,FirstName,LastName)
Team(Id, Name, IsProfessional)
El jugador solo puede pertenecer a un equipo. El uso de TPT (DB primero), tenemos dos clases asignada a esas tablas:
public class Player
{
public int Id{get;set;}
public int TeamId{get;set;}
public string FirstName{get; set;}
public string LastName{get; set;}
public Team Team{get;set;}
}
public class Team
{
public int Id{get; set;}
public string Name{get;set;}
public bool IsProfessional{get;set;}
public IEnumerable<Player> Players{get;}
}
Lo que me gustaría lograr es propiedad IsProfessional en la entidad del jugador:
public class Player
{
public int Id{get;set;}
public int TeamId{get;set;}
public string FirstName{get; set;}
public string LastName{get; set;}
public Team Team{get;set;}
**public bool IsProfessional{get;}** should be read-only
}
¿Es posible configurar la asignación que manera en que la propiedad IsProfessional se puede usar en consultas linq?
var result= db.Players.Where(p=>p.IsProfessional==true);
y tener ese campo poblado cada vez que se materializa la entidad de jugador?
Player pl = db.Players.Where(p=>p.FirstName="Lionel").FirstOrDefault();
if(pl.IsProfessional)
{
//do something...
}
intentado ya con:
- Entidad División. No es posible porque quiero mantener el mapeo del equipo y porque la relación no es 1: 1)
- Mapeo de la entidad del jugador a una vista de db. No me gustó porque hay otras relaciones que la entidad del jugador tiene que necesito. Sé que es posible crearlos manualmente, pero la actualización de edmx desde la base de datos restablecerá ssdl.
Gracias
Solución
Basado en segunda opción en Gert Arnold respuesta, solución que se adapte a mis necesidades es la siguiente:
puedo crear la función
GetIsProfessional
(tenía que hágalo porque los campos calculados normalmente solo se pueden hacer desde los campos de la tabla propia)CREATE FUNCTION [dbo].[GetIsProfessional](@teamId as INT) RETURNS bit BEGIN DECLARE @isProfi AS bit SELECT @isProfi = IsProfessional FROM Teams WHERE Id = @teamId RETURN @isProfi END
creé campo calculado en
Player
mesaALTER TABLE Players ADD [IsProfessional] AS dbo.GetIsProfessional(TeamId)
Como estoy usando primera aproximación db, acabo de actualización del modelo de base de datos y eso es todo, puedo consultar en ese campo y es pre poblada cuando el objeto Player se materializa.
Entonces 'Player.IsProfessional' debe dar el mismo resultado que' Player.Team.IsProfessional'? Actualmente, EF no admite propiedades que no se asignan a un campo de base de datos simple, lo siento, pero tal vez alguien responderá con una buena alternativa. – hvd
Eso es exactamente lo que necesito, excepto Player.IsProfessional debe ser de solo lectura. Todas las alternativas que pude encontrar no son realmente agradables. –