EF 6 コード ファーストおよび SQL サーバーで、階層ごとのテーブル アーキテクチャを 1 対 1 の関係と組み合わせて実装する際に問題があります。Entity Framework は、右側の列を外部キーとして使用しません。
クラスVersion
と 2 つの継承クラスProductVersion
がありFeatureVersion
ます。
public class Version
{
[Key]
public Int32 ID { get; private set; }
public Int32 Major { get; private set; }
public Int32 Minor { get; private set; }
public Int32 Patch { get; private set; }
..
}
2 つの継承クラスは、ナビゲーション プロパティのみを実装します。
public class ProductVersion : Version
{
[Required]
public virtual Product.Product Product { get; set; }
public Int32 ProductId { get; set; }
}
public class FeatureVersion : Version
{
[Required]
public virtual Feature Feature { get; set; }
public Int32 FeatureId { get; set; }
}
現在、私の製品では 1 対多の関係を使用しており、すべて正常に動作しています。
public class Product
{
public Int32 ID { get; set; }
public String Name { get; set; }
public List<Versioning.ProductVersion> ProductVersions { get; set; }
...
}
私の機能では、1 対 1 の関係を使用していますが、問題が発生します。
public class Feature : ICloneable
{
public Int32 Id { get; set; }
...
public int FeatureVersionId { get; set; }
public virtual Entities.Versioning.FeatureVersion FeatureVersion { get; set; }
...
}
結果の移行は次のようになります
CreateTable(
"dbo.Versions",
c => new
{
ID = c.Int(nullable: false),
...,
FeatureId = c.Int(),
ProductId = c.Int(),
Discriminator = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => t.ID)
.ForeignKey("dbo.Features", t => t.ID)
.ForeignKey("dbo.Products", t => t.ProductId, cascadeDelete: true)
.Index(t => t.ID)
.Index(t => t.ProductId);
ご覧のとおり、機能への外部キーは間違った列を使用しています。
t => t.ID
手動で外部キーに変更するとt => t.FeatureId, cascadeDelete: true
、データベースに正しく挿入されますが、EF ではイニシャルFeatureVersion
;で新しい機能を挿入する際に問題があるようです。newFeatureVersion
のFeatureId
列は常に 0 に設定されるため、例外が発生します (コードでは、単に新しいFeatureVersion
オブジェクトを Feature オブジェクトに割り当て、コンテキストの変更を保存しようとします)。1 対多の関係を持つ Product では、すべてが正常に機能します。
興味深いことに、Feature の参照を
public List<Versioning.ProductVersion> ProductVersions { get; set; }
に
public List<Versioning.Version> Versions { get; set; }
たとえば、マザー クラスでは、すべて正常に動作します。移行では、正しい列が結合されていることがわかり、INSERT も機能します。しかし、間違いなく、これは私が望むものではありません。
継承はどういうわけかEFを苛立たせていますか?私は重要な点を見逃していますか?
FeatureVersion
また、 for と同じように、 for を 1対多の関係に変更しようとしましたProduct
。正常に動作しますが、これは私が使用する必要がある関係ではありません。