2012-01-22 6 views
3

という簡単な質問が作成されます。WithEventsとしてフラグが立てられたプライベートフィールドは、Code Firstによって取り込まれ、自動外部

Public Class MyClass 
    Private WithEvents pPerClass As PersistableClass 
    Public Overridable Property PerClass() As PersistableClass 
     Get 
      Return pPerClass 
     End Get 
     Set(value As PersistableClass) 
      pPerClass= value 
     End Set 
    End Property 

    'Other code 
    '... 

End Class 

Public Class PersistableClass 
    Public Property PersistableClassID as Integer 
    'Other methods and properties 
    '... 
End Class 

のMyClassが永続化とDBが正常にコードファーストを使用して作成された場合は、以下の2つの外部キーがMyClassesを指しテーブルに作成されます。次のコードを考える

  • pPerClass_PersistableClassID (FK、INT、NULL)(NULL、FK、INT)
  • PerClass_PersistableClassID

最初不思議プライベートフィールドから得られた第2の鍵の複製、です。

WithEventsキーワードを削除すると、pPerClass_PersistableClassIDキーは作成されません。

私はEFの新人ですが、私には奇妙な行動があるようです。

何らかの理由がありますか?

+0

私はエンティティフレームワークを使用していませんが、永続化されるイベント用に作成されるデリゲートのバッキングフィールドと関係している可能性があります(オブジェクトのシリアル化時に問題になることもあります)。 [このリンク](http://www.lhotka.net/WeBlog/PermaLink.aspx?guid=776f44e8-aaec-4845-b649-e0d840e6de2c)をご覧ください。 –

+0

ありがとうポール、私はリンクを見てきました、それは意味があるようです。データベースの作成中にEFが実際に何をするかを調べようとします。 – APaglia

答えて

1

考えられる1つの理由は、WithEventsの実装方法の副作用です。デコンパイラでコンパイルしたクラスを開くと、WithEventsフィールドの名前を持つプロパティが作成され、そのプロパティの独自のバッキングフィールドが作成されたことがわかります。

これを見て、WithEventsキーワードをどのように実装するのかを考えれば、なぜこれが行われたのか分かります。この追加のプロパティは、プロパティが設定されているときに適切なイベントハンドラがフックされ、フックされないようにするために使用されます。

私は本当に知っているほどEFを使用していませんでしたが、私はそのプロパティがプライベートであり、それがEFに影響すると驚いています。これは、WithEventsがEFでうまく動作せず、イベントハンドラを手動でフックする必要があることを意味しています。

+0

ギデオンに感謝、それは理にかなっています。デコンパイルされたメンバのリストでは、新しく作成されたプロパティは他のプロパティと同様に定義され、その違いはgetter/setterスコープ宣言によって行われます。しかし、あなたがリフレクションを使用すると、プライベートではありません。 – APaglia

関連する問題