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时,我将重新讨论这个答案。