EF 6.1 :
多くの pf 継承を持つプロジェクトを開始したばかりです。選択された継承データベース マッピング タイプは、階層ごとのテーブルです。問題は、add-migration を使用して移行を生成しようとすると、次のエラーがスローされることです。
The foreign key component 'VersionId' is not a declared property on type 'SER'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property.
使用されるクラスと構成クラスは次のとおりです。
public class Version : BaseObject
{
public virtual ICollection<SER> ListOfSER { get; set; }
}
public abstract class AbsractR : BaseObject
{
public int ParentId { get; set; }
public int ChildId { get; set; }
public int VersionId { get; set; }
public virtual Version Version { get; set; }
}
public class SER : AbstractR
{
public int SEDId
{
get
{
return base.ChildId;
}
set
{
base.ChildId = value;
}
}
public virtual SED SED { get; set; }
}
public abstract class AbstractD : BaseObject
{
}
public class SED : AbstractD
{
public virtual ICollection<SER> ListOfSER { get; set; }
}
public class SDContext : BaseContext
{
public DbSet<Version> Versions { get; set; }
public DbSet<AbstractD> Ds { get; set; }
public DbSet<AbstractR> Rs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new VersionConfiguration());
#region Refs
modelBuilder.Configurations.Add(new AbstractRConfiguration());
modelBuilder.Configurations.Add(new SERConfiguration());
#endregion
#region Defs
modelBuilder.Configurations.Add(new AbstractDConfiguration());
modelBuilder.Configurations.Add(new SEDConfiguration());
#endregion
}
}
public class BaseObjectConfiguration<T> : EntityTypeConfiguration<T> where T : BaseObject
{
public BaseObjectConfiguration()
{
#region Key
this.HasKey(bo => bo.Id);
#endregion
#region Properties
this.Property(bo => bo.Id).IsRequired();
this.Property(bo => bo.IsDeleted).IsRequired();
this.Property(bo => bo.LastModificationDate).IsOptional();
this.Property(bo => bo.OptimisticVersion).IsConcurrencyToken().IsRequired().IsRowVersion();
this.Property(bo => bo.CreationDate).IsRequired();
this.Property(bo => bo.DeletionDate).IsOptional();
#endregion
}
}
public class VersionConfiguration : BaseObjectConfiguration<Version>
{
public VersionConfiguration() : base()
{
#region Properties
#endregion
#region Objects
this.HasMany(mdv => mdv.ListOfSER).WithRequired().HasForeignKey(ser => ser.VersionId).WillCascadeOnDelete(false);
#endregion
#region Table
this.ToTable("Versions");
#endregion
}
}
public class AbstractRConfiguration : BaseObjectConfiguration<AbstractR>
{
public AbstractRConfiguration()
: base()
{
#region Properties
this.Property(ser => ser.VersionId).IsRequired();
#endregion
#region Objects
this.HasRequired(ar => ar.Version).WithMany().HasForeignKey(ar => ar.VersionId).WillCascadeOnDelete(false);
#endregion
#region Table
this.ToTable("Refs");
#endregion
}
}
public class SERConfiguration : BaseObjectConfiguration<SER>
{
public SERConfiguration()
: base()
{
#region Properties
this.Ignore(ser => ser.SEDId);
#endregion
#region Objects
this.HasRequired(ser => ser.SED).WithMany(sed => sed.ListOfSER).HasForeignKey(ser => ser.ChildId).WillCascadeOnDelete(false);
#endregion
#region Table
this.ToTable("Refs");
#endregion
}
}
public class AbstractDConfiguration : BaseObjectConfiguration<AbstractD>
{
public AbstractDConfiguration() : base()
{
this.ToTable("Defs");
}
}
public class SEDConfiguration : BaseObjectConfiguration<SED>
{
public SEDConfiguration()
: base()
{
#region Properties
#endregion
#region Objects
this.HasMany(sed => sed.ListOfSER).WithRequired(sed => sed.SED).HasForeignKey(sed => sed.ChildId).WillCascadeOnDelete(false);
#endregion
#region Table
this.ToTable("Defs");
#endregion
}
}
[ForeignKey] 属性を使用して、派生クラスのナビゲーション プロパティが親抽象クラスで定義された列を使用する必要があることを伝えられることはわかっています。DataAnnotations の使用は避けたいと考えています。なぜこのエラーがスローされるのかわかりません。「バージョン」ナビゲーション プロパティは、SER 構成ではなく AbstractR 構成で定義されています (SER は AbstractR から継承されているため、これも機能するはずです)。
次に、Version プロパティとマッピングを削除すると、SER マッピングで使用される「ChildId」および「ParentId」プロパティで同じ問題が発生します。これは既知の問題ですか?私は何か間違っていますか?
PS : ParentId マッピングは、ChildId マッピングと同じ問題と思われるため、簡単にするために削除されました。
なぜこの種の問題が起こっているのか、誰にも分かりますか?
アップデート
さらに調査した結果、Fluent API は基本クラスのプロパティをマッピングに使用できないことがわかりました。そうですか?これは望ましい動作ですか?DataAnnotations が Fluent API ではなく基本クラスのプロパティを使用できるのはなぜですか? すべての基本クラスのプロパティがすべてのクラス内に挿入されていませんか、それともある種のデコレータ パターンで読み取られていますか?