我目前有EF核心代码,对以下ER建模:

enter image description here

我想添加一个关系属性,如下所示:

enter image description here

以下是当前代码的相关部分:

public class System
{
    public string SystemId { get; set; }
    public List<Component> Components { get; set; } = new List<Component>();
}

public class Component
{
    public int ComponentId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

----

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<System>()
            .HasMany(s => s.Components)
            .WithMany();
}

这段代码在数据库中构建了一个查找表,将两个实体链接起来.就像这样:

Current tables

对于我想要实现的更改,我希望在查找表中有一个新的列(即版本),但我找不到任何方法来实现它.

我已try 按如下方式更改代码:

public class System
{
    public string SystemId { get; set; }
    public List<ComponentRelationship> Components { get; set; } = new List<ComponentRelationship>();
}

public class ComponentRelationship
{
    public int Id { get; set; } 
    public Component Component { get; set; }
    public string Version { get; set; }
}

但它并没有真正做到我想要的.

有哪些方法可以创建关系属性?

推荐答案

您的两个关系图都显示了一对多关系,而在您的实体代码中您声明了unidirectional many-to-many个关系.如果您确实需要多对多(即系统可以有多个组件,并且组件可以属于多个系统),则只需添加payload to the join table即可.最简单的 Select 是声明显式联接实体:

public class SystemComponentVersion
{
    public int Id { get; set; } 
    public System System{ get; set; }
    public Component Component { get; set; }
    public string Version { get; set; }
}

public class System
{
    public string SystemId { get; set; }
    public List<Component> Components { get; set; } = new List<Component>();
    public List<SystemComponentVersion> SystemComponents{ get; set; } = new List<SystemComponentVersion>();
}

public class Component
{
    public int ComponentId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public List<System> Systems { get; set; } = new List<System>();
    public List<SystemComponentVersion> SystemComponents{ get; set; } = new List<SystemComponentVersion>();
}

通过流畅的API提供了以下内容:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<System>()
        .HasMany(e => e.Components)
        .WithMany(e => e.Systems)
        .UsingEntity<SystemComponentVersion>());
}

Csharp相关问答推荐

如何从顶部提取发票号作为单词发票后的第一个匹配

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

数组被内部函数租用时,如何将数组返回给ArrayPool?

为什么SignalR在每个Blazor服务器应用程序启动时最多启动8个服务器?

模型绑定RazorPage表单

如何解决提交按钮后 Select 选项错误空参照异常

我如何让我的秒表保持运行场景而不重置

HttpRequestMessage.SetPolicyExecutionContext不会将上下文传递给策略

如何向事件添加成员

正在try 从Blazor中的API读取JSON

在implementationFactory中避免循环依赖

如何避免在.NET中将日志(log)写入相对路径

如何在.NET MAUI中最大化GraphicsView的大小?

如何从Entity Framework Core中填充ListIInterface

此异步方法在重写方法中缺少等待运算符警告

如何使用EPPlus C#在单个单元格中可视化显示多行文字

C#Microsoft.CodeAnalysis.CSharp.Scriiting不等待并行.对于

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

处理方法内部过滤与外部过滤

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?