我遇到的问题很容易,但我的思想停止了工作。如果我的问题很愚蠢,很抱歉,但是我对数据库不是很在行(我也不喜欢EFCore)。
我想要下表:
简历:带有ID和名称/标题(字符串)
技能:具有ID和名称/标题(字符串)
SkillsCV:使用ID、CvID (简历中记录的外键)、SkillID (技能记录的外键)
我不想在简历和技能表中有SkillsCV的外键。有可能吗?在.NET内核中是否有可能,更重要的是使用Fluent API?我为FluentAPI做了一个小的研究,在一对一的关系中,两端都有外键。需要这个吗?顺便说一句,这是一对一的关系,对吧?我不想让一方知道另一方。这就是所谓的0到1,还是完全不同?我真的很困惑。
因此,我在FluentAPI中看到的一对一关系需要以下代码:
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
发布于 2020-05-19 15:38:00
你拥有的是一段多对多关系。你可以做这样的模型:
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设置它,您可以这样做:
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表将有一个由SkillID和CVID (确保引用完整性)组成的组合键。
发布于 2020-05-19 15:30:13
只有在我正确理解你的情况下,你才能用注释来做这件事。
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的技能,您将在表中有一行。
var allSkillFromCv = await _context.SkillCvs.Where(s => s.CvId == 1).ToListAsync()如果您想使用导航属性
var allSkillFromCv = await _context.SkillCvs.Where(s => s.CvId == 1).Include(s => s.Skill).ToListAsync();发布于 2020-05-19 15:56:51
这里需要三个表: CVs表、技能表和技能表。在简历表和技能表之间有很多到多的关系。您必须使用Fluent API定义多到多的关系。在简历表和技能表中都需要导航属性。
public class CV
{
....
public IList<SkillCV> SkillsCVs { get; set; }
}
public class Skill
{
....
public IList<SkillCV> SkillsCVs { get; set; }
}在DB上下文中
public DbSet<SkillCV> SkillsCVs { get; set; }您还需要使用Fluent API定义关系。
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);https://stackoverflow.com/questions/61893713
复制相似问题