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

C# 实体框架6,通过两个ID定义关系,c#,entity-framework,entity-framework-6,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 virt

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

模型(简化)如下所示:

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 });
builder.Entity<Settings>()
       .HasMany(s => s.Configs)
       .HasForeignKey(s => new {s.NodeId, s.UserId});
 builder.Entity<Settings>()
            .HasMany(s => s.Configs)
            .WithOne()
            .HasForeignKey(c => new {c.NodeId, c.UserId})
            .HasPrincipalKey(s => new {s.NodeId, s.UserId});
现在关系已经改变,因此我必须处理多个模板,再加上几个新标志,如下所示:

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 });
builder.Entity<Settings>()
       .HasMany(s => s.Configs)
       .HasForeignKey(s => new {s.NodeId, s.UserId});
 builder.Entity<Settings>()
            .HasMany(s => s.Configs)
            .WithOne()
            .HasForeignKey(c => new {c.NodeId, c.UserId})
            .HasPrincipalKey(s => new {s.NodeId, s.UserId});
因此,基于共享ID对
NodeId,UserId

但我的EF知识仍然非常有限

我通过
DbModelBuilder
ForeignKey
-属性进行了尝试。不同的错误;所有这些都归结为关系中的主体和受抚养人之间的ID数量不匹配


谢谢您的帮助。

您的
设置
类有一个单列主键
公共Guid Id{get;set;}
。定义关系时,EF core尝试绑定2列外键。
HasForeignKey(s=>new{s.NodeId,s.UserId})
'Settings'
的1列主键,这是不可能的。但您可以告诉EF将外键绑定到称为“主键”的不同列。尝试在代码中添加
.WithPrincipal()
,如下所示:

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 });
builder.Entity<Settings>()
       .HasMany(s => s.Configs)
       .HasForeignKey(s => new {s.NodeId, s.UserId});
 builder.Entity<Settings>()
            .HasMany(s => s.Configs)
            .WithOne()
            .HasForeignKey(c => new {c.NodeId, c.UserId})
            .HasPrincipalKey(s => new {s.NodeId, s.UserId});

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

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 });
builder.Entity<Settings>()
       .HasMany(s => s.Configs)
       .HasForeignKey(s => new {s.NodeId, s.UserId});
 builder.Entity<Settings>()
            .HasMany(s => s.Configs)
            .WithOne()
            .HasForeignKey(c => new {c.NodeId, c.UserId})
            .HasPrincipalKey(s => new {s.NodeId, s.UserId});

无论您是通过属性、约定还是fluent API配置EF,这都无关紧要。这三种方法在功能上几乎相同,其中fluentapi是最具表现力的。与手头的主题相关,如果您如图所示配置FK,是否会出现任何错误?@TanveerBadar fluent API要求我也定义另一个方向
。HasMany(s=>s.Configs)。WithRequired(c=>c.Setting)。HasForeignKey(…)
。为此添加了一个虚拟道具,但仍然出现错误
关系约束中从属角色和主体角色中的属性数必须相同。
无论您是通过属性、约定还是fluent API配置EF,这都无关紧要。这三种方法在功能上几乎相同,其中fluentapi是最具表现力的。与手头的主题相关,如果您如图所示配置FK,是否会出现任何错误?@TanveerBadar fluent API要求我也定义另一个方向
。HasMany(s=>s.Configs)。WithRequired(c=>c.Setting)。HasForeignKey(…)
。为此添加了一个虚拟道具,但仍然出现错误
关系约束中从属角色和主体角色中的属性数必须相同。
遗憾的是,我们仍在该项目中运行EF6,这些方法不可用。不过,谢谢你,也不走运。
WithOne()
既不可用,
Map()
也不提供
MapLeftKey
MapRightKey
。我读了更多的书,似乎我不能用我现在的EF版本解决这个问题。尽管如此,这还是很有教育意义的,当我们更新EF时,我会重新考虑这个答案。遗憾的是,我们仍然在这个项目中运行EF6,这些方法不可用。不过,谢谢你,也不走运。
WithOne()
既不可用,
Map()
也不提供
MapLeftKey
MapRightKey
。我读了更多的书,似乎我不能用我现在的EF版本解决这个问题。尽管如此,这是非常有教育意义的,当我们更新EF时,我将重新讨论这个答案。