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:

  1. 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
  2. J'ai créé champ calculé sur Player table

    ALTER TABLE Players ADD [IsProfessional] AS dbo.GetIsProfessional(TeamId)
  3. 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 que Player.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.
InformationsquelleAutor Misha N. | 2012-10-09