2011-10-29 19 views
0

レガシーPOCOモデルでレガシーデータベースをマップしようとしています。 Entity Frameworkを気にせずに開発しているデータベースとモデルの間には、いくつかの小さな違いがあります。Entity Frameworkコードファースト - ヌル入力不可タイプのデフォルト値

私が直面している課題は、あまりにも多くのコードが依存しているため、できるだけ侵襲の少ない(データベースのコードやモデルに触れたくない)ようにしたいということです。

私は、レガシーモデルからのPOCOを再利用して、コードの最初のアプローチを使用してエンティティをマップしようとしました。いくつかのnull可能な数値の列が、プリミティブなInt32(nullableではない)として宣言されているプロパティにマップされていることがわかったので、すべてが動作するように見えました。

CREATE TABLE [dbo].[SomeTable](
    [Id] [int] NOT NULL, 
    [Descrip] [nvarchar](50) NULL, 
    [SomeNumericCol] [int] NULL, 
CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)) ON [PRIMARY] 

と対応POCO:

public class SomeTable 
{ 
    public Int32 Id { get; set; } 
    public string Descrip { get; set; } 
    public Int32 SomeNullableCol { get; set; } 
} 

あなたが列SomeNullableColと対応に差がある見るかもしれませんが例えば

、のは、私はテーブルを持っているとしましょう最後の型はnullを許さないプリミティブなint型であるため

SomeNullableColの型をnull可能なint(私はInt32?を意味します)に変更しなくても、このマッピングを動作させるためのハックはありますか?可能であれば、クラスのコードには触れません。

ありがとうございます!

答えて

1

POCOのプロパティをnullにできますか?

public class SomeTable 
{ 
    public Int32 Id { get; set; } 
    public string Descrip { get; set; } 
    public Int32? SomeNumericCol { get; set; } 
} 
+0

いいえ、私はできません:-(。私が言ったように、それらのプロパティにintに依存するコードが多すぎるので、nullable型に変更することはできません。 lotのプロパティも変化する... – Maxolidean

1

はい、データ注釈でマスクしてください。 null可能なintを作成し、それを列名にマスキングし、null値の列からint値のみを返す同じ名前のマップされていないプロパティを作成します。

 [Column("SomeNullableCol")] 
     public int? TestValue { get; set; } 

     [NotMapped] 
     public int SomeNullableCol 
     { 
      set { TestValue = value; } 
      get 
      { 
       if (TestValue != null) return (int) TestValue; 
       return -1; 
      } 
     } 
+0

それはPOCOの定義に触れたくないので問題の一部を解決するだろうが、それは私に次の考えを与える:POCOを継承し、 "プロキシ"プロパティを追加する私は反射でそれをやろうとしています... – Maxolidean

+2

このハックは少なくともPOCOの現在の構造を維持していますので、レガシーコードはあなたの要件に合わせて強化されています。 POCOをレガシーDBにマッチさせてから、古いPOCOを新しいDBにマップします。 – benjamin

+0

はい、私が言ったように、 nswerは、(Reflection.Emitを使用して)null可能なプロパティを持つ型を動的に構築するアイディアを提供します。次に、生成された型をデータベースにマップできます。ありがとう。 – Maxolidean

関連する問題