首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是什么类型的关系,以及如何在.NET核心(EFCore,FluentAPI)中实现?

这是什么类型的关系,以及如何在.NET核心(EFCore,FluentAPI)中实现?
EN

Stack Overflow用户
提问于 2020-05-19 14:36:05
回答 3查看 42关注 0票数 0

我遇到的问题很容易,但我的思想停止了工作。如果我的问题很愚蠢,很抱歉,但是我对数据库不是很在行(我也不喜欢EFCore)。

我想要下表:

简历:带有ID和名称/标题(字符串)

技能:具有ID和名称/标题(字符串)

SkillsCV:使用ID、CvID (简历中记录的外键)、SkillID (技能记录的外键)

我不想在简历和技能表中有SkillsCV的外键。有可能吗?在.NET内核中是否有可能,更重要的是使用Fluent API?我为FluentAPI做了一个小的研究,在一对一的关系中,两端都有外键。需要这个吗?顺便说一句,这是一对一的关系,对吧?我不想让一方知道另一方。这就是所谓的0到1,还是完全不同?我真的很困惑。

因此,我在FluentAPI中看到的一对一关系需要以下代码:

代码语言:javascript
复制
modelBuilder.Entity<Skill>()
        .HasOne(skill => skill.SkillCV) // but I don't have a SkillCV object in Skill model
        .WithOne(skillCV => skillCV.Skill) // I have skillCV.Skill
        .HasForeignKey<SkillCV>(skillCV => skillCV.SkillID); // I have this foreign key in skillCV as well

但是我不希望在技能表中有一个对象(或者外键)(因为我不希望在CVs表中有这样的对象)。,这有可能吗?,我肯定做错了什么。你能帮我找出我的错误(如果有)吗?

如果你知道更好的方法,请分享。提前感谢!

编辑:我想创建的一个快速示例:

简历表:

ID,名称

1 "CV1“

2 "CV2“

3 "CV3“

技能表:

ID,名称

1 "C#“

2 "Java“

3 "Python“

技能简历表:

ID,CvID,SkillID

1 1 1

2 1 3

3 2 1

这是解决这个问题的好办法吗?我还没有创建技能简历表,现在我只有简历和技能(每个技能都有一个CV_ID),但是这样当我需要在前面填充一个选择框时,我需要从API返回不同的技能(例如,对于不同的C#有800条记录)。我原以为技能履历表能解决这个问题,但我现在不太确定:D

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-19 15:38:00

你拥有的是一段多对多关系。你可以做这样的模型:

代码语言:javascript
复制
public class Skill
 {
    public int Id { get; set; }

    public string Name { get; set; }
 }

 public class CV
 {
    public int Id { get; set; }

    public string Name { get; set; }
 }

 public class SkillCV
 {
    public int SkillID { get; set; }

    public Skill Skill { get; set; }

    public int CVID { get; set; }

    public CV CV { get; set; }
 }

然后,要用Fluent API设置它,您可以这样做:

代码语言:javascript
复制
modelBuilder.Entity<SkillCV>()
    .HasKey(t => new { t.SkillID, t.CVID});

modelBuilder.Entity<SkillCV>()
    .HasOne(pt => pt.Skill)
    .WithMany()
    .HasForeignKey(pt => pt.SkillID);

modelBuilder.Entity<SkillCV>()
    .HasOne(pt => pt.CV)
    .WithMany()
    .HasForeignKey(pt => pt.CVID);

这样,以后的联接将很简单,SkillCV表将有一个由SkillIDCVID (确保引用完整性)组成的组合键。

票数 1
EN

Stack Overflow用户

发布于 2020-05-19 15:30:13

只有在我正确理解你的情况下,你才能用注释来做这件事。

代码语言:javascript
复制
 public class Skill
 {
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
 }
 public class Cv
 {
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
 }
 public class SkillCv
 {
    [ForeignKey("Skill")]
    public int SkillId { get; set; }
    [ForeignKey("Cv")]
    public int CvId { get; set; }

    public virtual Skill Skill{ get; set; }

    public virtual  Cv Cv { get; set; }
 }

public class TestContext : DbContext
{
    public DbSet<Skill> Skills { get; set; }
    public DbSet<Cv> Cvs { get; set; }
    public DbSet<SkillCv> SkillCvs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //The entity does not have its own key, only the relationship of the two
        modelBuilder.Entity<SkillCv>().HasNoKey();
    }

}

因此,对于每个具有cv的技能,您将在表中有一行。

代码语言:javascript
复制
var allSkillFromCv = await _context.SkillCvs.Where(s => s.CvId == 1).ToListAsync()

如果您想使用导航属性

代码语言:javascript
复制
var allSkillFromCv = await _context.SkillCvs.Where(s => s.CvId == 1).Include(s => s.Skill).ToListAsync();
票数 1
EN

Stack Overflow用户

发布于 2020-05-19 15:56:51

这里需要三个表: CVs表、技能表和技能表。在简历表和技能表之间有很多到多的关系。您必须使用Fluent API定义多到多的关系。在简历表和技能表中都需要导航属性。

代码语言:javascript
复制
public class CV
{
    .... 

    public IList<SkillCV> SkillsCVs { get; set; }
}
 public class Skill
 {
        .... 

        public IList<SkillCV> SkillsCVs { get; set; }
 }

在DB上下文中

代码语言:javascript
复制
  public DbSet<SkillCV> SkillsCVs { get; set; }

您还需要使用Fluent API定义关系。

代码语言:javascript
复制
modelBuilder.Entity<SkillCV>()
    .HasOne<Skill>(sc => sc.Skill)
    .WithMany(s => s.SkillsCVs)
    .HasForeignKey(sc => sc.SkillID);


modelBuilder.Entity<SkillCV>()
    .HasOne<CV>(sc => sc.CV)
    .WithMany(s => s.SkillsCVs)
    .HasForeignKey(sc => sc.CvID);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61893713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档