如何首先定义嵌套识别关系实体框架代码

And*_*ker 5 entity-relationship one-to-many ef-code-first entity-framework-5

我现在首先在一个简单的测试应用程序中使用EF5代码来测试各种功能.我已经在两个代表一对多链接的实体之间定义了"识别关系".在这里,我定义了一个具有许多子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()
    {
    }

}
Run Code Online (Sandbox Code Playgroud)

我的OnModelCreating实现包括;

modelBuilder.Entity<Photo>().Property(p => p.PhotoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Run Code Online (Sandbox Code Playgroud)

结果是当我删除PhotoCollection时,所有照片实体也被删除,这是由"识别关系"提供的.大.

我的问题是如何在这个对象图中定义更多级别,假设我想将PhotoProperties作为Photo中的一对多集合.在这种情况下,我想删除PhotoCollection,所有适当的Photo和PhotoProperty记录也将被删除.使用上面的方法,是否有必要向PhotoProperty添加指向PhotoCollection的GrandParent属性?

使用模型构建器中的流畅Api,我可以获得相同的结果吗?

我在网上找到的唯一例子是单级父级>子级层次结构.

提前致谢.

Sla*_*uma 10

在我看来,这应该工作:

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

    //...
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是PhotoCollectionIdPhotoProperty不指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);
Run Code Online (Sandbox Code Playgroud)