gpt4 book ai didi

ef-code-first - 如何首先定义嵌套的识别关系 Entity Framework 代码

转载 作者:行者123 更新时间:2023-12-04 06:26:24 24 4
gpt4 key购买 nike

我现在首先在一个简单的测试应用程序中使用 EF5 代码来测试各种功能。我已经定义了代表一对多链接的两个实体之间的“识别关系”。这里我定义了一个 PhotoCollection,它有很多子 Photo 实体;

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 记录也将被删除。使用上面的方法,是否有必要向指向 PhotoCollection 的 PhotoProperty 添加一个 GrandParent 属性?

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

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

提前致谢。

最佳答案

在我看来,这应该有效:

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但它是复合外键的一部分 (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);

关于ef-code-first - 如何首先定义嵌套的识别关系 Entity Framework 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13033934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com