与实体框架保存多对多关系

时间:2014-12-17 14:17:11

标签: c# asp.net-mvc 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项目。

我想知道如何使用Entity Framework保存多对多关系。我有以下表格,但只有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 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);

2 个答案:

答案 0 :(得分:1)

使用Entity Framework的代码优先方法,您的实体模型应如下所示:

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,那么它也会抛出错误。

答案 1 :(得分:0)

可能你需要映射关系:

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

        }
        //...
    }

您可以在此处查看示例:Creating a Many To Many Mapping Using Code First

如果您想了解更多关于如何映射您的人际关系的信息,请查看以下其他链接:Configuring Relationships with the Fluent API