私は解決すべき面白い問題がありますが、一般的ですがEntity Frameworkでは容易に実現できないようです。 2つのテーブルがあります。Entity Framework - 関連テーブルの列にマップされたエンティティの読み取り専用プロパティ
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;}
}
プレーヤーエンティティのプロパティ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
}
は、それが可能なマッピングを設定することですものlinqクエリでIsProfessionalプロパティを使用できますか?
var result= db.Players.Where(p=>p.IsProfessional==true);
このフィールドにPlayerエンティティがマテリアライズされるたびにそのフィールドが設定されますか?
- エンティティ分割:
はすでにしてみました。チームマッピングを維持したい、関係が1:1でないために不可能)Player pl = db.Players.Where(p=>p.FirstName="Lionel").FirstOrDefault(); if(pl.IsProfessional) { //do something... }
- dbビューへのプレーヤーエンティティのマッピング。他の関係があるので好きではなかったPlayerのエンティティには必要なものがあります。手動で作成することは可能ですが、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)
に、計算フィールドを作成し、それは事前に人口ですPlayerオブジェクトがマテリアライズされたとき。
だから 'Player.IsProfessional'は' Player.Team.IsProfessional'と同じ結果を与えるはずですか? EFは現在、単純なデータベースフィールドにマップされていないプロパティをサポートしていません。申し訳ありませんが、おそらく誰かが良い選択肢で回答します。 – hvd
それはPlayer.IsProfessionalを読むことを除いて、私が必要とするものです。私が自分で見つけられるすべての選択肢は、本当に素晴らしいものではありません。 –