5

現時点では、簡単なテスト アプリケーションで EF5 コードを最初に使用して、さまざまな機能をテストしています。1 対多のリンクを表す 2 つのエンティティ間の「識別関係」を定義しました。ここでは、多くの子 Photo エンティティを持つ PhotoCollection を定義します。

public class PhotoCollection
{
    public int Id { get; set; }
    public virtual ISet<Photo> Photos { get; private set; }

    public PhotoCollection()
    {
        Photos = new HashSet<Photo>();
    }
}

public class Photo
{
    [Key, ForeignKey("Parent"), Column(Order = 1)]
    public int PhotoCollectionId { get; set; }

    [Key, Column(Order = 2)]
    public int PhotoId { get; set; }

    public virtual PhotoCollection Parent { get; set; }


    [Required, MaxLength(200)]
    public string FilePath { get; set; }

    public Photo()
    {
    }

}

私の OnModelCreating の実装には次のものが含まれます。

modelBuilder.Entity<Photo>().Property(p => p.PhotoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

その結果、PhotoCollection を削除すると、「識別関係」によって提供されるすべての写真エンティティも削除されます。偉大な。

私の質問は、このオブジェクト グラフでさらにレベルを定義する方法です。たとえば、PhotoProperties を Photo の 1 対多のコレクションとして使用したいとします。この場合、PhotoCollection を削除すると、該当するすべての Photo および PhotoProperty レコードも削除されます。上記のアプローチを使用すると、PhotoCollection を指す PhotoProperty に GrandParent プロパティを追加する必要はないでしょうか?

モデル ビルダーで流暢な Api を使用して同じ結果を得ることができますか?

オンラインで見つけることができた唯一の例は、単一レベルの親>子階層の場合です。

前もって感謝します。

4

1 に答える 1

11

私の意見では、これはうまくいくはずです:

public class Photo
{
    [Key, ForeignKey("Parent"), Column(Order = 1)]
    public int PhotoCollectionId { get; set; }

    [Key, Column(Order = 2)]
    public int PhotoId { get; set; }

    public virtual PhotoCollection Parent { get; set; }

    public virtual ISet<PhotoProperty> PhotoProperties { get; private set; }

    //...
}

public class PhotoProperty
{
    [Key, ForeignKey("Parent"), Column(Order = 1)]
    public int PhotoCollectionId { get; set; }

    [Key, ForeignKey("Parent"), Column(Order = 2)]
    public int PhotoId { get; set; }

    [Key, Column(Order = 3)]
    public int PhotoPropertyId { get; set; }

    public virtual Photo Parent { get; set; }

    //...
}

PhotoCollectionIdinPhotoPropertyは a を参照するのではなく、 を参照する複合PhotoCollection外部キーの一部であることに注意してください。(PhotoCollectionId,PhotoId)Photo

はい、Fluent API を使用してマッピング全体を定義できます。

modelBuilder.Entity<PhotoCollection>()
    .HasMany(pc => pc.Photos)
    .WithRequired(p => p.Parent)
    .HasForeignKey(p => p.PhotoCollectionId);

modelBuilder.Entity<Photo>()
    .HasKey(p => new { p.PhotoCollectionId, p.PhotoId });

modelBuilder.Entity<Photo>()
    .Property(p => p.PhotoId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

modelBuilder.Entity<Photo>()
    .HasMany(p => p.PhotoProperties)
    .WithRequired(pp => pp.Parent)
    .HasForeignKey(pp => new { pp.PhotoCollectionId, pp.PhotoId });

modelBuilder.Entity<PhotoProperty>()
    .HasKey(pp => new { pp.PhotoCollectionId, pp.PhotoId, pp.PhotoPropertyId });

modelBuilder.Entity<PhotoProperty>()
    .Property(pp => pp.PhotoPropertyId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
于 2012-10-23T18:42:07.547 に答える