私はEntity Framework 4.3をコードで最初に使用し、手動で移行しています。私は、2つのカスタムdiscriminatorフィールドを使用するTPH(階層ごとのテーブル)設定をマップしようとしています。 1つは弁別子そのものとソフト削除のためのものです(NHクラスマッピングの "where"オプションによく似ています)。まったく同じ設定は、EF 4.2で動作する別のプロジェクトでうまく動作します。Entity Framework 4.3 - TPHマッピングと移行エラー
NuGetコンソールで「add-migration」コマンドを使用して移行を追加しようとすると、エラーが発生します。私はEntityTypeConfigurationクラスなどで、OnModelCreatingメソッドでクラスの属性を定義するすべての組み合わせを試しました。複雑な階層マッピングを伴わなかった以前のマイグレーションはうまくいきました。
私が遭遇したEF4.3にいくつかの大きな変化がありますか?
コード:
//---- Domain classes ---------------------
public abstract class ParentClass
{
public string ParentString { get; set; }
}
public class Foo : ParentClass
{
public string FooString { get; set; }
}
public class Bar : ParentClass
{
public string BarString { get; set; }
}
//---- Mapping configuration --------------
public class ParentConfiguration : EntityTypeConfiguration<ParentClass>
{
public ParentConfiguration()
{
Map<Foo>(m =>
{
m.Requires("IsActive").HasValue(1);
m.Requires("Type").HasValue("Foo");
})
.ToTable("Parent");
Map<Bar>(m =>
{
m.Requires("IsActive").HasValue(1);
m.Requires("Type").HasValue("Bar");
})
.ToTable("Parent");
}
}
//---- Context ----------------------------
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ParentConfiguration());
}
エラー:
System.InvalidOperationException: The type 'Foo' has already been mapped to table 'Parent'. Specify all mapping aspects of a table in a single Map call.
at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.AddMappingConfiguration(EntityMappingConfiguration mappingConfiguration)
at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.ReassignSubtypeMappings()
at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
at System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(DbContext context, XmlWriter writer)
at System.Data.Entity.Migrations.Extensions.DbContextExtensions.<>c__DisplayClass1.<GetModel>b__0(XmlWriter w)
at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(Action`1 writeXml)
at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(DbContext context)
at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext)
at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration)
at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator()
at System.Data.Entity.Migrations.Design.ToolingFacade.GetPendingMigrationsRunner.RunCore()
at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
Mihkel
ありがとう、これは私が欲しかったものです。そして、奇妙なやり方で、各サブタイプのための1つの構成が正しいと感じます。下位互換性は素晴らしいですが、将来のリリースで修正されることを願っています。 – Mihkel
これは3年遅れていますが、 'Map(m => m.Requires ...')は '' ToTable( "テーブル名") 'の呼び出しが終わったら**動作します。エンティティフレームワーク6.1.3 btw –