4

我現在在一個簡單的測試應用程序中首先使用EF5代碼來測試各種功能。我已經定義了代表一對多鏈接的兩個實體之間的「識別關係」。在這裏我定義了一個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); 

其結果是,當我刪除一個集光,所有的照片實體被刪除,以及其由「識別關係」提供。大。

我的問題是如何在此對象圖中定義更高層次,假設我想將PhotoProperties作爲Photo的一對多集合。在這種情況下,我想刪除PhotoCollection,並且所有相應的Photo和PhotoProperty記錄也將被刪除。使用上面的方法,是否有必要將一個GrandParent屬性添加到指向PhotoCollection的PhotoProperty中?

我可以在模型構建器中使用流暢的Api實現相同的結果嗎?

我在網上找到的唯一例子是針對單級父級>子級別。

在此先感謝。

回答

8

在我看來這應該工作:

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; } 

    //... 
} 

注意PhotoCollectionIdPhotoProperty並不是指一個PhotoCollection但就是指Photo複合外鍵(PhotoCollectionId,PhotoId)的一部分。

是的,你可以定義整個映射用流利的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); 
+0

非常感謝它完美的作品。 –

+0

這很有幫助。你知道這個有什麼好的文檔嗎?我正在嘗試爲Azure移動服務和Azure SQL做類似的事情。 – WiteCastle

相關問題