Entity framework core 如何仅在依赖实体上定义一对多关系并使其成为必需关系

Entity framework core 如何仅在依赖实体上定义一对多关系并使其成为必需关系,entity-framework-core,entity-framework-migrations,Entity Framework Core,Entity Framework Migrations,我对ef core 2.2中一对多关系的配置有问题。 我有以下场景(实体不同,但这并不相关)。问题是: 这个类已经存在于代码库中,我不能碰它 公共类顺序:实体{ //公共ICollection Orders;//我想要它,但我没有,我不能 } 我需要添加这个类: 公共类订单行:实体{ 公共秩序{get;set;}//我只有这个 } 我需要一些技术建议。我已经为类编写了配置: public void配置(EntityTypeBuilder) { HasKey(x=>x.Id); 属性(x=>x

我对ef core 2.2中一对多关系的配置有问题。 我有以下场景(实体不同,但这并不相关)。问题是:

这个类已经存在于代码库中,我不能碰它

公共类顺序:实体{
//公共ICollection Orders;//我想要它,但我没有,我不能
}
我需要添加这个类:

公共类订单行:实体{
公共秩序{get;set;}//我只有这个
}
我需要一些技术建议。我已经为类编写了配置:

public void配置(EntityTypeBuilder)
{
HasKey(x=>x.Id);
属性(x=>x.Order).IsRequired();
}
很遗憾,添加迁移时出现以下错误:

属性“Order.OrderLine”的类型为“OrderLine”,当前数据库提供程序不支持该类型。更改属性CLR类型或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.ignore”忽略该属性

删除行时:
builder.Property(x=>x.Order).IsRequired()该字段变为可空,这是不可接受的

我使用了以下技巧:

builder.Ignore(x=>x.Order);
builder.HasOne().WithMany().IsRequired().OnDelete(DeleteBehavior.Restrict);

但是,当我在构造OrderLine时设置Order字段时,我在保存到数据库时会出现异常,因为OrderId会获得默认值(它会被忽略)。有办法解决这个问题吗?

您需要修改
OrderLine

公共类订单行:实体
{
public int Id{get;set;}//EF需要主键,如果它是在实体基类中声明的,请删除
public int OrderId{get;set;}//外键
公共虚拟订单订单{get;set;}//用于即时和延迟加载的导航属性。它应该是虚拟的
}

无需提供流畅的配置,按照惯例,它将创建一对多关系,并且OrderLine必须设置referenceing OrderId。

您确定这将导致迁移为required:true吗?这种方法有两个缺点:引用实体的id是一个与持久性相关的概念,泄漏到域模型,从领域驱动设计的角度来看,这是不干净的。第二个问题是您必须忽略实体配置中的Order属性,以避免表中出现重复的外键列。这也意味着,您必须手动设置OrderId,因为Order属性被忽略了——这也是我想要避免的,以保持我的域模型不受持久性相关概念的影响。(尽我所能)。不过,谢谢您的帮助。@Marcin它不会创建重复的外键。您不需要手动设置OrderId。如果您将Order&OrderLine添加为graph,EF将处理关系并在保存更改后更新OrderId。如果您不希望任何人使用OrderId列,可以使用[Observe]属性进行修饰。如果你发现任何其他合适的答案,请在这里张贴。