实体框架6,通过两个ID定义关系

时间:2020-09-24 12:16:57

标签: c# entity-framework entity-framework-6

上下文:我必须将模型的一部分从单个值更改为条目列表,并且需要帮助来定义两个类之间的关系。

模型(简体)看起来像这样:

public class Settings {
  public Guid Id { get; set; }

  public Guid NodeId { get; set; }
  public Guid UserId { get; set; }
  public Guid TemplateId { get; set; }

  // plus the respective virtual properties and a few more irrelevant things.
}

现在这种关系已经改变,因此我必须处理多个模板以及一些新标记,如下所示:

public class Settings {
  public Guid Id { get; set; }
  public Guid NodeId { get; set; }
  public Guid UserId { get; set; }
  public ICollection<TemplateConfig> Configs { get; set; }
  // ...
}

public class TemplateConfig {
  public Guid NodeId { get; set; }
  public Guid UserId { get; set; }
  public Guid TemplateId { get; set; }
  // and a few more flags
}

builder.Entity<TemplateConfig>().HasKey(t => new { t.NodeId, t.UserId, t.TemplateId });

由于我的许多访问都将直接在此列表上,并且基于节点,用户或模板的所有条目,因此我不介意ID的冗余,实际上我更喜欢它。

我不想不必添加SettingsId只是为了能够定义这种关系,而是要做类似的事情:

builder.Entity<Settings>()
       .HasMany(s => s.Configs)
       .HasForeignKey(s => new {s.NodeId, s.UserId});

因此基于共享ID对NodeId, UserId

但是我的EF知识仍然很有限。

我已经通过DbModelBuilderForeignKeyColumn属性进行了尝试。不同的错误;在关系中,所有这些都沸腾到主体和从属之间的ID数量不匹配。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的Settings类具有一个单列主键 public Guid Id { get; set; }。当您定义关系时,EF核心尝试将2列外键。HasForeignKey(s => new {s.NodeId, s.UserId});绑定到'Settings'的1列主键。但是您可以告诉EF将外键绑定到称为“主键”的不同列。尝试像这样在代码中添加.WithPrincipal()

 builder.Entity<Settings>()
            .HasMany(s => s.Configs)
            .WithOne()
            .HasForeignKey(c => new {c.NodeId, c.UserId})
            .HasPrincipalKey(s => new {s.NodeId, s.UserId});

EF 6的答案

由于EF 6没有.HasPrincipalKey(),因此应使用.Map()指定主体列:

builder.Entity<Settings>()
        .HasMany(s => s.Configs)
        .WithOne()
            .Map(cs =>
            {
                cs.MapLeftKey("NodeId", "UserId");
                cs.MapRightKey("NodeId", "UserId");
            });
相关问题