gpt4 book ai didi

c# - Entity Framework 在指定级联删除时无法加载外键数组属性

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:16 25 4
gpt4 key购买 nike

我有一个项目数据模型:

[DataContract]
public class Item
{
[Key]
[DataMember]
public int ItemId { get; set; }

[DataMember]
public string Title { get; set; }

[DataMember]
public string Description { get; set; }

[DataMember]
public ICollection<ItemImage> Images { get; set; }
}

并通过 ItemId 作为外键链接到 ItemImage 表:

[DataContract]
public class ItemImage
{
[Key]
[DataMember]
public int ItemImageId { get; set; }

[Required]
[DataMember]
public int ItemId { get; set; }

[Required]
[DataMember]
public string ImageUrl { get; set; }

[ForeignKey("ItemId")]
public virtual Item Item { get; set; }
}

在我添加以下代码之前一切正常

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ItemImage>()
.HasRequired(ii => ii.Item)
.WithMany()
.HasForeignKey(ii => ii.ItemId)
.WillCascadeOnDelete(true);
}

将级联删除设置为true后,无法加载Item中的Images属性。有人可以帮我弄清楚发生了什么吗?非常感谢!

最佳答案

你有那个问题是因为你错过了关系中多端的配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ItemImage>()
.HasRequired(ii => ii.Item)
.WithMany(i=>i.Images)
.HasForeignKey(ii => ii.ItemId)
.WillCascadeOnDelete(true);
}

它第一次起作用是因为 EF 使用您已应用的数据注释(如 ForeignKey)并且默认情况下 EF 识别您想要创建一对多关系,因为导航您在两个实体中都拥有的属性。

此外,如果依赖实体 (ItemImage) 上的外键不可为 null,则默认情况下代码优先 sets cascade delete在关系上,所以如果你愿意,你不需要使用 Fluen Api 配置,你的关系已经用级联删除设置了。

最后一件事,如果你想让你的导航属性延迟加载,那么你需要将它们声明为virtual:

[DataContract]
public class Item
{
//...
[DataMember]
public virtual ICollection<ItemImage> Images { get; set; }
}

关于c# - Entity Framework 在指定级联删除时无法加载外键数组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29578971/

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