使用实体框架保存多对多关系
本文关键字:关系 保存 框架 实体 | 更新日期: 2023-09-27 18:34:25
解决方案:最后,我想出了我需要做什么,那就是先清除语言列表。现在我可以保存工作机会语言:
public void SaveJobOffer(JobOffer jobOffer)
{
if (jobOffer.ID == 0)
{
context.JobOffers.Add(jobOffer);
}
else
{
JobOffer existingJob = context.JobOffers.Find(jobOffer.ID);
existingJob.Client = jobOffer.Client;
(...)
existingJob.Languages.Clear();
existingJob.Languages = jobOffer.Languages;
}
context.SaveChanges();
}
我正在开发一个 ASP.NET MVC5项目,使用C#和Razor引擎与Visual Studio。
我想知道如何使用实体框架保存多对多关系。我有以下表格,但只有JobOffer
和Languages
出现在 Edmx 文件中:
JobOffer
:
- Id
- Client
- ...
Jobffer_Languages
:
- JobOfferId
- LanguageId
- ...
Languages
:
- Id
- Name
- ...
为了保存工作提供我正在做的事情:
public void SaveJobOffer(JobOffer jobOffer)
{
if (jobOffer.ID == 0)
{
context.JobOffers.Add(jobOffer);
}
else
{
context.JobOffers.Attach(jobOffer);
context.Entry(jobOffer).State = EntityState.Modified;
context.SaveChanges();
}
}
但是语言没有被保存。我需要做什么?
提前致谢
[编辑]
我的工作报价控制器代码:
JobOffer jobOffer = new JobOffer();
jobOffer.ID = id;
...
var list = new List<Language>();
for (int i = 0; i < languages.Length; i++)
{
Language language = repository.GetLanguageById(languages[i]);
list.Add(language);
}
jobOffer.Languages = list;
repository.SaveJobOffer(jobOffer);
使用实体框架的代码优先方法,实体模型应如下所示:
public class JobOffer {
[Key]
public int Id { get; set; }
public string Client { get; set; }
public virtual ICollection<Language> Languages { get; set; }
}
public class Language {
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<JobOffer> JobOffers { get; set; }
}
这将创建以下表:
JobOffer
- Id
- Client
JobOfferLanguage
- JobOfferId
- LanguageId
Language
- Id
- Name
向 JobOffer 实例添加语言时,您只需:
if(jobOffer.Languages == null) jobOffer.Languages = new List<Language>();
jobOffer.Languages.Add(newLanguage);
如果此实体保留在上下文中:
context.JobOffers.Add(jobOffer);
EntityFramework 将处理约束和关系表。因此,JobOfferLanguage
表中添加相应的关联。
如果newLanguage
不是有效的实体,即它是 null 或具有无效的 Id,它也会引发错误。
可能需要映射关系:
public class YourContext : DbContext
{
//...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<JobOffer>().
HasMany(c => c.Languages).
WithMany(p => p.JobOffers).
Map(
m =>
{
m.MapLeftKey("JobOfferId");
m.MapRightKey("LanguageId");
m.ToTable("JobOfferLanguages");
});
}
//...
}
您可以在此处查看示例:首先使用代码创建多对多映射
如果您想了解更多如何映射您的关系,请查看其他链接:使用 Fluent API 配置关系