Entity Framework - Entité propriété en lecture seule mappé à une colonne de la table liée
J'ai des problème intéressant à résoudre, mais, bien que commun, on dirait qu'il n'est pas facilement réalisable avec Entity Framework. Il y a deux tables:
Player(Id,TeamId,FirstName,LastName)
Team(Id, Name, IsProfessional)
Joueur peut appartenir qu'à une seule équipe. À l'aide de la TPT (DB première), nous avons deux classes mappées à ces tables:
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;}
}
Ce que je souhaite réaliser est la propriété IsProfessional sur le Joueur de l'entité:
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
}
Il est possible de configurer le mappage de cette façon IsProfessional propriété peut être utilisée dans les requêtes linq?
var result= db.Players.Where(p=>p.IsProfessional==true);
et que champs à chaque fois Joueur de l'entité est matérialisée?
Player pl = db.Players.Where(p=>p.FirstName="Lionel").FirstOrDefault();
if(pl.IsProfessional)
{
//do something...
}
Déjà essayé avec:
- Fractionnement D'Entité. Pas possible parce que je veux garder de l'Équipe de cartographie et parce que la relation n'est pas 1:1)
- Cartographie Joueur de l'entité à un db de vue. N'a pas aimé parce qu'il y a d'autres relations Lecteur entité dont j'ai besoin. Je sais qu'il est possible de créer manuellement, mais la mise à jour edmx à partir de la base de données de réinitialisation des trois laboratoires.
Grâce
Solution
Basée sur la deuxième option dans Gert Arnold réponse, solution qui s'adapte à mes besoins est comme suit:
-
J'ai crée une fonction
GetIsProfessional
(eu à le faire parce que les champs calculés peuvent normalement être faite uniquement à partir des champs de la table)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
-
J'ai créé champ calculé sur
Player
tableALTER TABLE Players ADD [IsProfessional] AS dbo.GetIsProfessional(TeamId)
-
Que je suis en utilisant db première approche, je viens de mettre à jour le modèle de base de données et c'est tout, je peux interroger sur ce domaine, et il est pré rempli lorsque l'objet de Joueur est matérialisé.
- Donc
Player.IsProfessional
devraient donner le même résultat quePlayer.Team.IsProfessional
? EF ne supporte actuellement pas de propriétés qui ne correspondent pas à un simple champ de base de données, désolé, mais peut-être que quelqu'un va répondre avec une bonne alternative. - C'est exactement ce dont j'ai besoin, à l'exception de Joueur.IsProfessional doit être en lecture seule. Toutes les solutions que j'ai pu trouver moi-même ne sont pas vraiment agréable.
Vous devez vous connecter pour publier un commentaire.
Cela ne peut être fait avec EF. Il y a quelques options qui ne font pas exactement ce que vous voulez, mais se rapprocher plus ou moins:
Créer une propriété
TeamPlayers
dans votre contexte qui renvoie les joueurs avec l'équipe inclus, de sorte que vous pouvez toujours faireplayer.Team.IsProfessional
même si le contexte a déjà été diposed.Créer un champ calculé dans la table de base de données et la carte avec
DatabaseGeneratedOption.Computed
.Créer une propriété statique dans
Player
que renvoie l'expression qui accède àTeam.IsProfessional
(nécessite un contexte de vie ou de l'équipe inclus):Je préfère le champ calculé, parce qu'il est toujours rempli, de sorte que vous pouvez l'utiliser à l'intérieur et à l'extérieur de la portée d'un contexte.
Vous pouvez utiliser
System.ComponentModel.DataAnnotations.Schema.NotMappedAttribute
pour empêcher la cartographie de laIsProfessional
propriété comme celles-ci:J'ai utilisé cet attribut dans
EF5's Model First
approche et je l'ai interrogé au cours deDbContext/DbSet
etObjectContext/ObjectQuery
, sans aucune exception. (100% testé)Que si vous étendez Joueur à avoir une propriété qui tire de l'Équipe?
Bien sûr, si vous êtes inquiet au sujet de la régénération de votre EDMX, vous pouvez en faire un partiel: