繁体   English   中英

如何告诉 EF Core 相同类型的两个属性?

[英]How do I tell EF Core about two properties of the same type?

我有一组代表法律案件的模型。 用户可以对案例执行的操作之一是生成文档。 此操作被保存为一个History实体,并带有一个关联的HistoryFile实体,该实体包含有关文件的数据。 其他操作可能会导致一个History实体,具有零个或多个关联的HistoryFile实体。

这两个类的缩减版看起来像这样......

  public class History {
    public int Id { get; set; }
    public ObservableCollection<HistoryFile> HistoryFiles { get; set; }
  }

  public class HistoryFile {
    public int Id { get; set; }
    public int HistoryId { get; set; }
    public History History { get; set; }
  }

下一个要求是用户可以选择先前生成的文档并继续处理它。 我卡住的一点是HistoryFile实体需要引用回包含先前版本的History实体。 这意味着我需要在HistoryFile实体中添加两行代码......

  public class HistoryFile {
    public int Id { get; set; }
    public int HistoryId { get; set; }
    public History History { get; set; }
    public int? PreviousHistoryId { get; set; }
    public virtual History PreviousHistory { get; set; }
  }

这意味着从HistoryFileHistory有两个链接,一个是必需的,它是父History实体(通过History属性),另一个是通过PreviousHistory属性的可选链接。

我不知道如何为 EF Core 进行设置。 按照现在的代码,当我尝试添加迁移时,出现以下错误...

无法在“History.HistoryFiles”和“HistoryFile.PreviousHistory”之间创建关系,因为“History.HistoryFiles”和“HistoryFile.History”之间已经存在关系。 导航属性只能参与单个关系。 如果您想在“OnModelCreating”中首先在导航“HistoryFile.PreviousHistory”上覆盖现有关系调用“Ignore”。

我尝试将以下内容添加到我的DbContext ...

builder.Entity<HistoryFile>(entity => {
  entity.HasOne(hf => hf.History)
    .WithMany(h => h.HistoryFiles)
    .HasForeignKey(hf => hf.HistoryId)
    .OnDelete(DeleteBehavior.Restrict);
  entity.HasOne(hf => hf.PreviousHistory)
    .WithMany(h => h.HistoryFiles)
    .HasForeignKey(hf => hf.PreviousHistoryId)
    .OnDelete(DeleteBehavior.Restrict);
});

......但它没有任何区别。

谁能告诉我如何配置它,以便 EF Core 知道两个实体之间有两个不同的链接?

我在 .NET5 项目中使用 EF Core 5.0.7,以防万一。

谢谢

知道了。

我需要将以下两行添加到History class ...

public virtual ICollection<HistoryFile> HistoryFilesParentHistory { get; set; }
public virtual ICollection<HistoryFile> HistoryFilesPreviousHistory { get; set; }

...然后将我添加到DbContext的代码更改为如下所示...

builder.Entity<HistoryFile>(entity => {
  entity.HasOne(hf => hf.History)
    .WithMany(h => h.HistoryFilesParentHistory)
    .HasForeignKey(hf => hf.HistoryId)
    .OnDelete(DeleteBehavior.Restrict);
  entity.HasOne(hf => hf.PreviousHistory)
    .WithMany(h => h.HistoryFilesPreviousHistory)
    .HasForeignKey(hf => hf.PreviousHistoryId)
    .OnDelete(DeleteBehavior.Restrict);
});

这工作得很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM