我将尝试设计以下实体关系:
这些类的建模如下:
我没有使用FluentApi来指定任何内容(但我对此没有反感)。 使用上述代码,我得到了以下错误:
“在保存不公开其关系外键属性的实体时发生错误。EntityEntries属性将返回null,因为无法将单个实体标识为异常来源。通过在实体类型中公开外键属性,可以更轻松地处理保存时的异常。有关详细信息,请参见InnerException。
InnerException:无法确定依赖操作的有效排序方式。由于外键约束、模型要求或存储生成的值可能存在依赖项。”
我尝试将ProgramAssembly更改为以下内容。
然而,我遇到了以下错误:
然后出现了以下错误:
“在保存不公开其关系外键属性的实体时发生错误。EntityEntries 属性将返回 null,因为无法将单个实体标识为异常来源。通过在实体类型中公开外键属性可以更轻松地处理保存时的异常。有关详细信息,请参见 InnerException。 UpdateException: 无法确定依赖操作的有效排序。由于外键约束、模型要求或存储生成的值,可能存在依赖项。”
如何在不改变向程序集添加“IsPrimary”属性的方法的情况下允许该关系?
我在 SO 上看到了一些类似的问题,但它们要么是关于 EF Core 的,比如 this one,要么建议进行重大逻辑更改,比如 this one,甚至 this one 连编译都无法通过。
- 程序
- 组件
这些类的建模如下:
public class Program
{
public int Id {get;set;}
public virtual ProgramAssembly MainAssembly {get;set;}
public virtual ICollection<ProgramAssembly> Assemblies {get;set;}
}
public class ProgramAssembly
{
public int Id {get;set;}
public virtual Program Program {get;set;}
public int ProgramId {get;set;}
}
我没有使用FluentApi来指定任何内容(但我对此没有反感)。 使用上述代码,我得到了以下错误:
“在保存不公开其关系外键属性的实体时发生错误。EntityEntries属性将返回null,因为无法将单个实体标识为异常来源。通过在实体类型中公开外键属性,可以更轻松地处理保存时的异常。有关详细信息,请参见InnerException。
InnerException:无法确定依赖操作的有效排序方式。由于外键约束、模型要求或存储生成的值可能存在依赖项。”
我尝试将ProgramAssembly更改为以下内容。
public class ProgramAssembly
{
[ForeignKkey("Program")]
public int Id {get;set;}
public virtual Program Program {get;set;}
}
然而,我遇到了以下错误:
我还尝试了下面的流畅API方法。ProgramAssembly_Program_Source: : 在关系“ProgramAssembly_Program”中,角色“ProgramAssembly_Program_Source”的重复性无效。因为从属角色引用了关键属性,所以从属角色的上限必须为“1”。
modelBuilder.Entity<ProgramAssembly>()
.HasRequired(a => a.Program)
.WithMany(p => p.Assemblies);
public class ProgramAssembly
{
public int Id { get; set; }
public virtual Program Program { get; set; }
[ForeignKey("Program")] //same error with or without this attribute
public int ProgramId { get; set; }
}
然后出现了以下错误:
“在保存不公开其关系外键属性的实体时发生错误。EntityEntries 属性将返回 null,因为无法将单个实体标识为异常来源。通过在实体类型中公开外键属性可以更轻松地处理保存时的异常。有关详细信息,请参见 InnerException。 UpdateException: 无法确定依赖操作的有效排序。由于外键约束、模型要求或存储生成的值,可能存在依赖项。”
如何在不改变向程序集添加“IsPrimary”属性的方法的情况下允许该关系?
我在 SO 上看到了一些类似的问题,但它们要么是关于 EF Core 的,比如 this one,要么建议进行重大逻辑更改,比如 this one,甚至 this one 连编译都无法通过。
Assembly
中添加一个IsPrimary
属性会比有两个关系更好看。 - Camilo Terevintoprogram.Assemblies.Single(x => x.IsMain)
(或者你甚至可以将其作为导航属性)即可,但你是对的,你需要在保存时验证它。对于 EF Core,答案应该使用 Fluent API 工作得很好。我相信你不能通过 DataAnnotations 来实现这一点。 - Camilo TerevintoProgramAssembly.Id
,而所有其他程序集的外键为ProgramAssembly.ProgramId
。您对此是否满意?(对我来说,这听起来确实很糟糕) - Camilo Terevinto