簡體   English   中英

使用實體框架保存多對多關系

[英]Saving Many-to-Many relationships with Entity Framework

解決方案:最后,我弄清楚了我需要做的事情,那就是首先簡單地清除語言列表。 現在,我可以保存求職語言:

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();
        }

我正在使用Visual Studio將C#和Razor引擎用於ASP.NET MVC5項目。

我想知道如何使用實體框架保存多對多關系。 我有下表,但Edmx文件中僅顯示JobOfferLanguages

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 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配置關系

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM