在EF Core中,如何在.NET Core Web API的DB-first迁移中添加无外键的导航属性

4

我正在使用一个已有系统,并将其更新到.NET Core、Web API和EF Core。

现有系统有两个表:

  • 父表:Id,name等
  • 子表:Id,ParentId,name等

尽管子表中存在ParentId,但没有外键引用,但我想在查询父表时能够使用包含。我要求不要将FK作为删除的一部分添加,而是将负值放入parentId列。这样他们就可以将其带回来,并且遗留系统是以这种方式构建的。

现在,在数据库优先迁移中,我如何指定一个没有fk的导航属性,让我的EF Core实现关系;或者至少将它们一起返回。添加可空外键不是一个选择,因为当添加了-ve(负)值时,它会破坏系统。

我确实建议进行完整的DB清理并摆脱-ve值,但这需要大量测试,并且没有交付成果。简而言之,在数据库优先迁移中如何添加导航属性而没有外键?

我尝试通过在模型中添加集合和虚拟条目来添加它,但在迁移后,它被覆盖了。我已经按照此文档在modelbuilder中使用HasMany添加了这个 - https://learn.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key

但是scaffolding正在覆盖我的导航属性。

1个回答

5
我已经找到了这个问题的答案。
在EF Core 3.x中,由DBFirst脚手架创建的DbContext都是partial类。因此,我执行了以下步骤: 1.为上下文类创建新的partial类-在此处使用OnModelCreatingPartial()方法添加导航属性的关系。下面是示例:
public partial class dbContext : DbContext
{
    partial void OnModelCreatingPartial(ModelBuilder builder)
    {
        builder.Entity<Packcomponent>()
        .HasOne(p => p.Pack)
        .WithMany(b => b.PackComponent)
        .HasForeignKey(p => p.PackId);
    }
}
  1. extended the partial class in a new file and added navigation property there.

    
     public partial class Packcomponent
     {
       public Pack Pack { get; set; }
     }
     public partial class Pack
     {
       public List PackComponent { get; set; }
     }

在脚手架过程中,这种方式不会覆盖自定义导航属性,我也可以使用这些属性来执行EF操作,如.Include()和保存相关实体。这真的很棒!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接