かなりの数のデータ構造を持つプロジェクトがあり、それにデータベースを導入したいと考えています。Entity Framework CTP5 のコード ファースト機能について調べています。
現在、タイプごとに個別の Identifier タイプを使用しています (例: TypeAIdentifier、TypeBIdentifier など)。これらの識別子を操作するときにタイプ セーフが可能になるため、これは素晴らしいことです。問題は、EF に非プリミティブ型を識別子として使用させることができないように見えることです。http://blogs.msdn.com/b/efdesign/archive/2010/03/30/data-annotations-in-the-entity-framework-and-code-first.aspxにヒントがあります。
KeyAttribute
KeyAttribute is used to specify that a property/column is part of the primary
key of the entity and applies to scalar properties only.
実際、次のプログラムは例外をスローします。
class Program
{
static void Main(string[] args)
{
MyDb db = new MyDb();
db.SaveChanges();
}
}
class MyDb : DbContext
{
public DbSet<MyObject> MyObjects { get; set; }
}
class MyObject
{
[Key] public MyIdentifierType MyId { get; set; }
public int IntValue { get; set; }
}
class MyIdentifierType
{
public int UniqueId { get; set; }
}
奇妙なことに、このプログラムは MissingMethodException (「このオブジェクトにはパラメーターなしのコンストラクターが定義されていません」) をスローしますが、次のいずれかによってプログラムが実行されるため、これは KeyAttribute に関連していると確信しています。
- [キー] を削除します。また
- [Key] を IntValue に移動します。
EF で識別子クラスを PK としてマップするにはどうすればよいですか? 頭に浮かぶ2つのオプション:
- EF で非プリミティブ型を PK として使用する方法を見つけます。
- 「int」を PK として配置し、EF にこの「int」を MyIdentifier に変換させます (これには、「int」以外のものを使用することにした場合、MyIdentifier とマッピングの両方を更新する必要があるという欠点があります。ただし、少なくとも識別子の型の安全性を維持できます)。Function Imports でこれができると思ったのですが、ストアド プロシージャの上に構築されているようです。
これを達成する方法はありますか?