2

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;で新しい機能を挿入する際に問題があるようです。newFeatureVersionFeatureId列は常に 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。正常に動作しますが、これは私が使用する必要がある関係ではありません。

4

0 に答える 0