解决方案:最后,我弄清楚我需要做什么,就是首先清楚语言列表。现在我可以保存工作机会语言:
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保存多对多关系。我有以下表格,但只有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 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);
答案 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