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 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...
}
Уже пробовал с:
Разделение сущностей, Невозможно, потому что я хочу сохранить командную карту и потому что отношения не 1: 1)Сопоставление сущности Player с представлением базы данных, Didn»Мне это нравится, потому что есть другие отношения, которые есть у игрока. Я знаю, что можно создать их вручную, но обновление EDMX из базы данных сбросит SSDL.Спасибо
Решение
Основываясь на втором варианте ответа Герт Арнольда, решение, которое соответствует моим потребностям, выглядит следующим образом:
Я создаю функциюGetIsProfessional
(пришлось сделать это, потому что вычисляемые поля обычно могут быть сделаны только из собственных полей таблицы)
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
Я создал вычисляемое поле наPlayer
Таблица
ALTER TABLE Players ADD [IsProfessional] AS dbo.GetIsProfessional(TeamId)
Насколько я'Я использую DB первый подход, я просто обновляю модель из базы данных, и это 'если я могу запросить это поле,предварительно заполняется, когда объект Player материализован.