gpt4 book ai didi

entity-framework-core - 使用 Entity Framework 7 Code First 定义自引用外键关系

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

我有一个 ArticleComment实体,如下所示:

public class ArticleComment
{
public int ArticleCommentId { get; set; }
public int? ArticleCommentParentId { get; set; }

//[ForeignKey("ArticleCommentParentId")]
public virtual ArticleComment Comment { get; set; }
public DateTime ArticleDateCreated { get; set; }
public string ArticleCommentName { get; set; }
public string ArticleCommentEmail { get; set; }
public string ArticleCommentWebSite { get; set; }
public string AricleCommentBody { get; set; }

//[ForeignKey("UserIDfk")]
public virtual ApplicationUser ApplicationUser { get; set; }
public Guid? UserIDfk { get; set; }

public int ArticleIDfk { get; set; }
//[ForeignKey("ArticleIDfk")]
public virtual Article Article { get; set; }


}

我想以这样的方式定义外键关系,即一个评论可以有多个回复或子项,我尝试使用像这样的 fluent API 创建关系:
builder.Entity<ArticleComment>()
.HasOne(p => p.Comment)
.WithMany()
.HasForeignKey(p => p.ArticleCommentParentId)
.OnDelete(DeleteBehavior.Restrict)
.IsRequired(false);

我遵循了提出的解决方案 herehere ,但我收到一条错误消息:

Introducing FOREIGN KEY constraint 'FK_ArticleComment_ArticleComment_ArticleCommentParentId' on table 'ArticleComment' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.



首先我虽然通过设置 OnDelete(DeleteBehavior.Restrict)这会消失,但问题仍然存在,我也尝试使用数据注释 [ForeignKey("ArticleCommentParentId")]正如您在 ArticleComment 中看到的注释代码定义,但它没有用,我会很感激。

最佳答案

您没有正确建模您的实体。每个评论都需要一组回复,它们也是 ArticleComment 类型的,并且每个回复都是指向其父级的回复(注意添加的 ICollection 回复属性):

  public class ArticleComment
{
public ArticleComment()
{
Replies = new HashSet<ArticleComment>();
}

public int ArticleCommentId { get; set; }
public int? ParentArticleCommentId { get; set; }
public virtual ArticleComment ParentArticleComment{ get; set; }
public virtual ICollection<ArticleComment> Replies { get; set; }

//The rest of the properties omitted for clarity...
}

...和流畅的映射:
modelBuilder.Entity<ArticleComment>(entity =>
{
entity
.HasMany(e => e.Replies )
.WithOne(e => e.ParentArticleComment) //Each comment from Replies points back to its parent
.HasForeignKey(e => e.ParentArticleCommentId );
});

通过上述设置,您将获得一个开放式树结构。

编辑:
使用您只需要装饰 ParentArticleComment 属性的属性。
考虑到在这种情况下 EF 将按照约定解决所有关系。
[ForeignKey("ParentArticleCommentId")]
public virtual ArticleComment ParentArticleComment{ get; set; }

对于集合属性,EF 足够聪明,可以理解这种关系。

关于entity-framework-core - 使用 Entity Framework 7 Code First 定义自引用外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34435046/

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