2016-10-27 5 views
0

Ich versuche, eine Viele-zu-Viele-Beziehung zu aktualisieren. Ich habe zwei Modelle, Tagebuch und Tags. Das Modelltagebuch enthält eine Liste von Tags und Tags enthält eine Liste von Terminkalendern. Aber immer wenn ich versuche, ein anderes Tag zu einer vorhandenen Liste hinzuzufügen oder ein bestehendes zu ändern, bekomme ich eine Ausnahme:EntityFramework - Aktualisieren von Viele-zu-viele-Beziehungen

Der Entitätstyp List_1 ist nicht Teil des Modells für den aktuellen Kontext.

Funktioniert meine Art der Aktualisierung sogar auf Sammlungen? Oder gibt es einen anderen Ansatz, den ich mir ansehen sollte?

Tagebuch Modell

public class Diary 
{ 
    [Key] 
    public int IdDiary { get; set; } 

    [Required(ErrorMessage = "This field is required")] 
    public string NameDiary { get; set; } 

    [Required(ErrorMessage = "This field is required")] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 
    public DateTime CreationDate { get; set; } 

    public bool Locked { get; set; } 

    public ICollection<Entry> Entries { get; set; } 

    [DataType(DataType.MultilineText)] 
    [Required(ErrorMessage = "This field is required")] 
    public string Summary { get; set; } 

    public string ImageUrl { get; set; } 

    public ICollection<Tag> Tags { get; set; } 
} 

Einstiegsmodell

public class Entry 
{ 
    [Key] 
    public int IdEntry { get; set; } 

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 
    public DateTime CreationDate { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string EntryText { get; set; } 

    [ForeignKey("Diary_IdDiary")] 
    public Diary Diary { get; set; } 

    public int Diary_IdDiary { get; set; } 
    public string EntryName { get; set; } 
} 

Tag Modell

public class Tag 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Diary> Diaries { get; set; } 
} 

Update-Methode

public void UpdateDiary(Diary updatedDiary) 
    { 
     var searchResult = SearchDiary(updatedDiary); 
     if (searchResult != null) 
     { 
      updatedDiary.IdDiary = searchResult.IdDiary; 
      _context.Entry(searchResult).CurrentValues.SetValues(updatedDiary); 
      _context.Entry(searchResult.Tags).CurrentValues.SetValues(updatedDiary.Tags); 
      _context.SaveChanges(); 
     } 
    } 

SearchDiary Methode

public Diary SearchDiary(Diary searchDiary) 
    { 
     var queryResult = 
      _context.Diaries.Include(d => d.Entries).Include(d => d.Tags) 
       .Where(d => (d.NameDiary == searchDiary.NameDiary && d.CreationDate == searchDiary.CreationDate) || d.IdDiary == searchDiary.IdDiary); 
     return queryResult.FirstOrDefault(); 
    } 

Danke

+0

Statt 'öffentliche Liste Tags {get; einstellen; } 'go with' public ICollection Tags {get; einstellen; } '. Tun Sie dasselbe für "Einträge". –

+0

@CristianSzpisjak Vielen Dank, aktualisiert die Modelle zu Ihrem Vorschlag. – Zazoe

Antwort

0

hier zum Lesen ist ein Weg:

DiaryModel

public class Diary 
{ 
    [Key] 
    public int IdDiary { get; set; } 

    [Required(ErrorMessage = "This field is required")] 
    public string NameDiary { get; set; } 

    [Required(ErrorMessage = "This field is required")] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 
    public DateTime CreationDate { get; set; } 

    public bool Locked { get; set; } 

    public virtual ICollection<Entry> Entries { get; set; } 

    [DataType(DataType.MultilineText)] 
    [Required(ErrorMessage = "This field is required")] 
    public string Summary { get; set; } 

    public string ImageUrl { get; set; } 

    public ICollection<Tag> Tags { get; set; } 
} 

EntryModel

public class Entry 
{ 
    [Key] 
    public int IdEntry { get; set; } 

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 
    public DateTime CreationDate { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string EntryText { get; set; } 

    [ForeignKey("Diary_IdDiary")] 
    public virtual Diary Diary { get; set; } 

    public int Diary_IdDiary { get; set; } 
    public string EntryName { get; set; } 
} 

für Search

public Diary SearchDiary(int DiaryId) 
{ 
    return _context.Diaries 
     .Include(p => p.Entries) 
     .Include(p => p.Tags) 
     .FirstOrDefault(p => p.IdDiary == DiaryId); 
} 

For Update

public void UpdateDiary(Diary Diary) 
{ 
    _context.Update(Diary); 
    _context.SaveChanges(); 
} 

Sie sollten das modifizierte Diary Objekt an die Update-Funktionen übergeben.

+0

Vielen Dank für Ihre Antwort. Es aktualisiert das Tagebuch selbst, aber ich fürchte, es aktualisiert die Tags nicht. Wenn ich ein Tag eintippe, kann es das Tag erstellen, aber es erzeugt keine Beziehung zwischen dem Tagebuch und dem Tag. – Zazoe

+0

Ich habe den obigen Code überprüft, für mich funktioniert es gut. –

Verwandte Themen