sql >> データベース >  >> RDS >> Oracle

エンティティで主キーのないビューを使用する

    一意の識別子なしでエンティティモデルにビューを追加することは可能ですか?

    主キーがない場合は、いいえ。その結果、この種のエラーが発生します:

    モデルの生成中に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プロパティの属性



    1. ojdbc14.jarとojdbc6.jar

    2. Windows認証を使用してsqlalchemy経由でSQLServerに接続するにはどうすればよいですか?

    3. Perl DBD::Oracleモジュールのインストール

    4. Postgres 8.2で参照整合性を無効にするにはどうすればよいですか?