[英]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; }
}
这意味着从HistoryFile
到History
有两个链接,一个是必需的,它是父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.