Mam interesujący problem do rozwiązania, ale, choć często, wygląda na to, że nie jest łatwo osiągalny z Entity Framework. Dostępne są dwie tabele:Entity Framework - Właściwość tylko do odczytu obiektu odwzorowana na kolumnę pokrewnej tabeli
Player(Id,TeamId,FirstName,LastName)
Team(Id, Name, IsProfessional)
Gracz może należeć tylko do jednej drużyny. Korzystanie TPT (DB pierwszy), mamy dwie klasy odwzorowywane na tych tabelach:
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;}
}
Co chciałbym osiągnąć to własność IsProfessional na jednostkę gracza:
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
}
Czy jest możliwe aby skonfigurować mapowanie że w jaki sposób właściwość IsProfessional może być używana w zapytaniach linq?
var result= db.Players.Where(p=>p.IsProfessional==true);
i aby to pole było wypełniane za każdym razem, gdy obiekt gracza się zmaterializował?
Player pl = db.Players.Where(p=>p.FirstName="Lionel").FirstOrDefault();
if(pl.IsProfessional)
{
//do something...
}
Już próbowałem z:
- Entity Dzielenie. Nie jest możliwe, ponieważ chcę zachować mapowanie drużyn, a ponieważ relacja nie jest 1: 1)
- Odwzorowanie podmiotu odtwarzacza na widok bazy danych. To się nie podobało, ponieważ istnieją inne relacje, których potrzebuje gracz. Wiem, że można je utworzyć ręcznie, ale aktualizacja edmx z bazy danych zresetuje ssdl.
Dzięki
Rozwiązanie
oparciu o drugiej opcji w Gert Arnold odpowiedź, rozwiązanie, które pasuje do moich potrzeb jest następujący:
ja funkcję
GetIsProfessional
tworzyć (musiał zrób to, ponieważ pola obliczone zwykle mogą być wykonane tylko z własnych pól tabeli)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
stworzyłem pole obliczoną na
Player
tabeliALTER TABLE Players ADD [IsProfessional] AS dbo.GetIsProfessional(TeamId)
Ponieważ używam db pierwsze podejście, po prostu zaktualizować model z bazą danych i to, czy mogę zapytać o tej dziedzinie i to pre zaludnione kiedy obiekt gracza się zmaterializuje.
Więc 'Player.IsProfessional' powinien dać ten sam wynik co' Player.Team.IsProfessional'? EF nie obsługuje obecnie właściwości, które nie są mapowane do prostego pola bazy danych, przepraszam, ale być może ktoś odpowie dobrą alternatywą. – hvd
Dokładnie tego potrzebuję, z wyjątkiem Player.IsProfessional powinien być tylko do odczytu. Wszystkie alternatywy, które mogłem znaleźć, nie są naprawdę ładne. –