Entity Framework - Свойство только для чтения, сопоставленное столбцу связанной таблицы

У меня есть интересная проблема, которую нужно решить, но, хотя она часто встречается, похоже, что ее нелегко достичь с помощью Entity Framework. Есть две таблицы:

Player(Id,TeamId,FirstName,LastName)
Team(Id, Name, IsProfessional)

Игрок может принадлежать только одной команде. Используя TPT (сначала DB), у нас есть два класса, сопоставленных с этими таблицами:

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

Чего я хотел бы добиться, так это свойства IsProfessional объекта Player:

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
    }

Можно ли настроить отображение таким образом, чтобы свойство IsProfessional можно было использовать в запросах linq?

var result= db.Players.Where(p=>p.IsProfessional==true);

и заполнять это поле каждый раз, когда сущность Игрока материализуется?

Player pl = db.Players.Where(p=>p.FirstName="Lionel").FirstOrDefault();
if(pl.IsProfessional)
{
//do something...
}

Уже пробовал с:

Entity Splitting. Not possible because I want to keep Team mapping and because relationship is not 1:1) Mapping Player entity to a db view. Didn't like it because there are other relationships Player entity has that I need. I know it is possible to create them manually, but updating edmx from database will reset ssdl.

Спасибо

Solution

Основываясь на втором варианте ответа Герт Арнольда, решение, которое соответствует моим потребностям, выглядит следующим образом:

I create function GetIsProfessional (had to do it because computed fields normally can be made only from own table fields)

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

I created computed field on Player table

ALTER TABLE Players ADD [IsProfessional] AS dbo.GetIsProfessional(TeamId)

As I'm using db first approach, I just update model from database and that's it, I can query on that field and it's pre populated when Player object is materialized.

Ответы на вопрос(3)

Ваш ответ на вопрос