我现在首先在一个简单的测试应用程序中使用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()
{
}
}
我的OnModelCreating实现包括;
modelBuilder.Entity<Photo>().Property(p => p.PhotoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
结果是当我删除PhotoCollection时,所有照片实体也被删除,这是由“识别关系”提供的。大。
我的问题是如何在此对象图中定义更高级别,假设我想将PhotoProperties作为Photo中的一对多集合。在这种情况下,我想删除PhotoCollection,所有适当的Photo和PhotoProperty记录也将被删除。使用上面的方法,是否有必要将GrandParent属性添加到指向PhotoCollection的PhotoProperty?
我可以使用流畅的模型构建器Api获得相同的结果吗?
我在网上找到的唯一例子是单级父级&gt;子级别。
提前致谢。
答案 0 :(得分: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; }
//...
}
请注意PhotoCollectionId
中的PhotoProperty
并未引用PhotoCollection
,而是引用(PhotoCollectionId,PhotoId)
的复合外键Photo
的一部分。< / p>
是的,您可以使用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);