これは、EF6で機能するようになったこの質問の拡張です。ただし、共有プロパティと非共有プロパティの両方を持つサブクラスがある場合、問題があるようです。
これが私のモデル設定だとしましょう:
public abstract class Document
{
public int Id { get; set; }
public string NameOnDocument { get; set; }
}
public class BirthCertificate : Document
{
public string RegistrationNumber { get; set; }
}
public class Licence : Document
{
public string LicenceNumber { get; set; }
}
データベースでは、同じ列を共有したいBirthCertificate.RegistrationNumber
と考えています。そのため、次のようにモデルを設定しています。Licence.LicenceNumber
Number
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Document - base class
modelBuilder.Entity<Document>().HasKey(d => d.Id);
modelBuilder.Entity<Document>()
.Property(d => d.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Document>()
.Property(d => d.NameOnDocument)
.HasColumnName("Name");
// Birth certificate
modelBuilder.Entity<Document>().Map<BirthCertificate>(map =>
map.Property(c => c.RegistrationNumber).HasColumnName("Number"));
// Licence
modelBuilder.Entity<Document>().Map<Licence>(map =>
map.Property(l => l.LicenceNumber).HasColumnName("Number"));
}
データベースを生成すると、すべてが期待どおりに見え、機能します。
さて、当面の問題です。Licence
エンティティが有効期限も記録する必要があるとしましょう。だから私は次のようにそれを追加します:
public class Licence : Document
{
public string LicenceNumber { get; set; }
public DateTime ExpiryDate { get; set; }
}
データベースを再生成すると、次のようになります。
さらに、免許証と出生証明書を挿入しようとすると、次の例外が発生します。
タイプ 'System.Data.Entity.Infrastructure.DbUpdateException' の未処理の例外が EntityFramework.dll で発生しました
追加情報: エンティティまたは関連付け間で共有される値は、複数の場所で生成されます。マッピングによって、EntityKey がストアで生成された複数の列に分割されないことを確認します。
データベースが役に立たないため、その例外が発生する理由を理解できます。
私は何を逃したのですか?