使用实体框架保存多对多关系

本文关键字:关系 保存 框架 实体 | 更新日期: 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。

我想知道如何使用实体框架保存多对多关系。我有以下表格,但只有JobOfferLanguages出现在 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 配置关系