1

TPH アーキテクチャに基づいPictureて、関連するエンティティ ( ) を保持するエンティティ ( ) を挿入する必要があります。Ad

Pictureモデル:

public class Picture
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
}

public class AdPicture : Picture
{
    public Ad Ad { get; set; }
}

Adモデル:

public class Ad
{
    // Primary properties
    public int Id { get; set; }
    public string Title { get; set; }
}

public class AdCar : Ad
{
    public int? CubicCapacity { get; set; }
    public int? Power { get; set; }
}

Pictureに新しいを挿入したいのですがAdCar、試しました:

AdPicture picture = new AdPicture()
{
    Ad = _adRepository.GetById(adId),
    Filename = newFileName
};

_pictureService.CreateAdPicture(picture);

CreateAdPicture:

public void CreateAdPicture(AdPicture adPicture)
{
    _adPictureRepository.Add(adPicture);
    _adPictureRepository.Save();
}

しかし、エンティティフレームワークは言う

*列名「AdCar_Id」が無効です。*

SQLコマンドテキストを確認すると、

insert [dbo].[Pictures]([Name], [Filename], [URL], [Rank], [Discriminator], [PictureType_Id], [AdCar_Id], [Ad_Id])
values (null, @0, null, @1, @2, @3, @4, null)

入れてるAdCar_IdのにAd_Idなんで?Picture関連するを挿入するにはどうすればよいAdCarですか?

4

2 に答える 2

0

私は問題を見つけました:

SQL コマンド「Ad_Id」で追加フィールドを作成する広告モデルで、ナビゲーション プロパティ「public IList Pictures { get; set; }」を定義していました。

削除するとすぐに、問題は解決し、TPH について持っていたすべての理論が再びまとまりました :)

ご意見をいただきありがとうございます。

于 2013-02-05T09:52:00.370 に答える
0

最初Ad_Idに、サブクラスのキーを明示的に定義して、想定どおりにする必要がある場合がありますAdCar_Id(またはその逆)。

DbContext で次のようなもの:

 modelBuilder.Entity<AdPicture>()
            .HasRequired(o => o.Ad)
            .WithMany().Map(f => f.MapKey("Ad_Id"));

2 番目:また、確認のために - これらのクラスはすべて完全に個別のテーブル (TPH) を持ち、指定された追加のプロパティ (TPH) だけを持つテーブルではありません。

TPH (TPT のみ) を実行していないため、Entity Framework がサブクラス化を別の方法で処理するかどうかはわかりませんが、そうする必要があると思います。そこに何かが欠けている場合は、他の誰かがうまく答えてくれることを願っています。

于 2013-02-04T15:44:02.960 に答える