[英]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文件中僅顯示JobOffer
和Languages
:
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.