一意の識別子なしでエンティティモデルにビューを追加することは可能ですか?
主キーがない場合は、いいえ。その結果、この種のエラーが発生します:
モデルの生成中に1つ以上の検証エラーが検出されました:
System.Data.Edm.EdmEntityType ::EntityType'SalesOnEachCountry'にはキーが定義されていません。このEntityType.System.Data.Edm.EdmEntitySetのキーを定義します。EntityType:EntitySetSalesOnEachCountryListは、キーが定義されていないタイプSalesOnEachCountryに基づいています。
一意の識別子がない場合は、はい、望ましくない出力がありますが。同じ識別子を持つレコードは同じオブジェクトを参照します。これはIDマップパターンと呼ばれます
たとえば、ビューで次の2つの行が生成される場合でも:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
国フィールドのみに主キーをマッピングする場合、例:
public class SalesOnEachCountry
{
[Key]
public int CountryId { get; set; }
public string CountryName { get; set; }
public int OrYear { get; set; }
public long SalesCount { get; set; }
public decimal TotalSales { get; set; }
}
、ビューがOracleクエリエディタで上記の2つの行を生成する場合でも、EntityFrameworkは次の誤った出力を生成します。
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000
Entity Frameworkは、2番目の行が最初の行と同じオブジェクトであると見なします。
一意性を保証するには、各行を一意にする列を特定する必要があります。上記の例では、主キーが一意になるように年を含める必要があります。つまり、
public class SalesOnEachCountry
{
[Key, Column(Order=0)] public int CountryId { get; set; }
public string CountryName { get; set; }
[Key, Column(Order=1)] public int OrYear { get; set; }
public long SalesCount { get; set; }
public decimal TotalSales { get; set; }
}
主キーを上記の属性と同様にすることで、EntityFrameworkは各ビューの行を独自のオブジェクトに正しくマップできます。したがって、Entity Frameworkは、ビューとまったく同じ行を表示できるようになりました。
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
詳細はこちら:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html
次に、行を一意にする列がないビューに関して、Entity Frameworkが各ビューの行を独自のオブジェクトにマップできることを保証する最も簡単な方法は、ビューの主キー<に個別の列を作成することです。 / em> 、適切な候補は、各行に行番号列を作成することです。例:
create view RowNumberedView as
select
row_number() over(order by <columns of your view sorting>) as RN
, *
from your_existing_view
次に、[Key]
を割り当てます class RowNumberedView
のRNプロパティの属性