上下文:我必须将模型的一部分从单个值更改为条目列表,并且需要帮助来定义两个类之间的关系。
模型(简体)看起来像这样:
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知识仍然很有限。
我已经通过DbModelBuilder
,ForeignKey
和Column
属性进行了尝试。不同的错误;在关系中,所有这些都沸腾到主体和从属之间的ID数量不匹配。
谢谢您的帮助。
答案 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没有.HasPrincipalKey()
,因此应使用.Map()
指定主体列:
builder.Entity<Settings>()
.HasMany(s => s.Configs)
.WithOne()
.Map(cs =>
{
cs.MapLeftKey("NodeId", "UserId");
cs.MapRightKey("NodeId", "UserId");
});