要在 EF Core 中添加没有外键的导航 属性,使用 .NET Core Web 进行数据库优先迁移 API
To add navigation property without foreign key in EF Core, DB-first migration with .NET Core Web API
我正在使用现有系统并将其更新为 .NET Core、Web API 和 EF Core。
现有系统有2个table:
- 家长table:身份证、姓名等
- Child table: Id, ParentId, name 等..
虽然子table中存在ParentId
,但没有外键引用,但我希望在查询父时能够使用include。我已要求不要添加 FK 作为删除的一部分,他们将 -ve 值放入 parentId
列。这样他们就可以把它带回来,这样就建立了一个遗留系统。
现在,在 db-first 迁移中,我如何指定一个没有 fk 的导航 属性 以便我的 EF Core 发挥关系;或者至少 return 他们在一起。添加可为空的外键不是一个选项,因为它会在添加 -ve 值时破坏系统。
我确实建议完全清理数据库并删除 -ve 值,但这涉及大量测试且无法交付。长话短说如何在数据库首次迁移中添加没有外键的导航属性?
我尝试在模型中添加集合和虚拟条目,但在迁移后它被覆盖了。我已根据此文档在模型构建器上使用 HasMany 添加了此内容 - https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key
但是脚手架覆盖了我的导航属性
我找到了答案。
在 EF 核心 3.x 中,DBFrist 脚手架创建的 dbcontext 都是部分 classes。
所以我做了以下事情:
1. 上下文 class 的新部分 class - 此处我使用 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);
}
}
在新文件中扩展了部分 class 并在其中添加了导航 属性。
public partial class Packcomponent
{
public Pack Pack { get; set; }
}
public partial class Pack
{
public List PackComponent { get; set; }
}
这种方式在构建基架时不会覆盖自定义导航属性,我也可以使用此属性执行 .Include() 等 EF 操作并保存相关实体。太棒了!!
我正在使用现有系统并将其更新为 .NET Core、Web API 和 EF Core。
现有系统有2个table:
- 家长table:身份证、姓名等
- Child table: Id, ParentId, name 等..
虽然子table中存在ParentId
,但没有外键引用,但我希望在查询父时能够使用include。我已要求不要添加 FK 作为删除的一部分,他们将 -ve 值放入 parentId
列。这样他们就可以把它带回来,这样就建立了一个遗留系统。
现在,在 db-first 迁移中,我如何指定一个没有 fk 的导航 属性 以便我的 EF Core 发挥关系;或者至少 return 他们在一起。添加可为空的外键不是一个选项,因为它会在添加 -ve 值时破坏系统。
我确实建议完全清理数据库并删除 -ve 值,但这涉及大量测试且无法交付。长话短说如何在数据库首次迁移中添加没有外键的导航属性?
我尝试在模型中添加集合和虚拟条目,但在迁移后它被覆盖了。我已根据此文档在模型构建器上使用 HasMany 添加了此内容 - https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key
但是脚手架覆盖了我的导航属性
我找到了答案。
在 EF 核心 3.x 中,DBFrist 脚手架创建的 dbcontext 都是部分 classes。 所以我做了以下事情: 1. 上下文 class 的新部分 class - 此处我使用 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);
}
}
在新文件中扩展了部分 class 并在其中添加了导航 属性。
public partial class Packcomponent { public Pack Pack { get; set; } } public partial class Pack { public List PackComponent { get; set; } }
这种方式在构建基架时不会覆盖自定义导航属性,我也可以使用此属性执行 .Include() 等 EF 操作并保存相关实体。太棒了!!