解決すべき興味深い問題がありますが、一般的ではありますが、Entity Framework では簡単に達成できないようです。次の 2 つのテーブルがあります。
Player(Id,TeamId,FirstName,LastName)
Team(Id, Name, IsProfessional)
プレイヤーは 1 つのチームにのみ所属できます。TPT (DB ファースト) を使用すると、これらのテーブルに 2 つのクラスがマップされます。
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;}
}
私が達成したいのは、Player エンティティの IsProfessional プロパティです。
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 エンティティが実体化されるたびにそのフィールドにデータが入力されるようにするには?
Player pl = db.Players.Where(p=>p.FirstName="Lionel").FirstOrDefault();
if(pl.IsProfessional)
{
//do something...
}
すでに試しました:
- エンティティ分割。チーム マッピングを維持したいため、また関係が 1:1 ではないため、不可能です)
- Player エンティティを db ビューにマッピングします。Playerエンティティには他にも必要な関係があるため、好きではありませんでした。手動で作成できることはわかっていますが、データベースから edmx を更新すると ssdl がリセットされます。
ありがとう
解決
Gert Arnold の回答の 2 番目のオプションに基づいて、私のニーズに合ったソリューションは次のとおりです。
関数を作成します
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 firstアプローチを使用しているので、データベースからモデルを更新するだけで、そのフィールドでクエリを実行でき、Playerオブジェクトが実体化されると事前に入力されます。