2017-10-26 3 views
1

Ich bin mit Definitionen von Entity-Framework gefangen und Objekte verwenden.
Ich versuche eine hochgeladene Datei zu speichern, sobald ich die Details zu dieser Datei in meiner Datenbank gespeichert habe.
Zugriff auf ein Objekt bei Verwendung unterschiedlicher Kontexte nicht möglich

public async Task<IActionResult> Edit(string List<IFormFile> files, [Bind("param")] Entity entity) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       _context.Update(entity); 
       await _context.SaveChangesAsync(); 

       //update Attachments 
       if (files.Count > 0) 
       { 
        attachment.UploadFiles(files); 
       } 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!EntityExists(id)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 
      return RedirectToAction("Index"); 
     } 
     return View(entity); 
    } 


Wenn ich die Anwendung ausführen und will das Formular I unten Fehlermeldung einreichen:
nicht angeordnet Objekt zugreifen kann. Objektname: 'FileBufferingReadStream'.

[HttpPost] 
    public async void UploadFiles(List<IFormFile> files) 
    { 
     if (files == null || files.Count == 0) 
     { 
      log.error("files not selected"); 
     } 
     try 
     { 
      List<string> filenames = new List<string>(); 
      string directory = Directory.GetCurrentDirectory() + "\\wwwroot"; 

      createDir(directory); 

      foreach (var file in files) 
      { 
       string filename = file.GetFilename(); 
       filenames.Add(filename); 
      } 
      if (filenames.Count > 0) 
       foreach (var filename in filenames) 
       { 
        AttachmentQ(filename, directory, createdBy); 
       } 
      foreach (var file in files) 
      { 
       string filename = file.GetFilename(); 
       var path = Path.Combine(directory, filename); 
       using (var stream = new FileStream(path, FileMode.Create)) 
       { 
        await file.CopyToAsync(stream); 
       } 
       filenames.Add(filename); 
      } 
     } 
     catch (Exception e) 
     { 
      log.error(e.Message); 

     } 
    } 

    [ValidateAntiForgeryToken] 
    public async void AttachmentQ(string filename, string path, string createdBy) 
    { 
     try 
     { 
      Attachment attachment = new Attachment 
      { 
       Name = filename, 
       Path = path, 
       CreatedBy = createdBy, 
       CreatedDate = DateTime.Now 
      }; 

       _context.Add(attachment); 
       await _context.SaveChangesAsync(); 
     } 
     catch (Exception e) 
     { 
      log.error(e.Message); 
     } 
    } 

Überraschenderweise ich Fehler nicht im Debug-Modus. Aber wenn ich die App starte, bekomme ich Diese Seite funktioniert nicht Fehler.
Ich bemerkte auch, dass ich einen Wert zurückgeben muss, wenn ich async benutze, aber ich habe keinen Rückgabewert in UploadFiles() und AttachmentQ() Methoden.
Könnten Sie mir bitte helfen, Objekte mit verschiedenen Kontexten zu behandeln?
Danke

+0

Also, wo genau sich Ihre Fehler auftreten? – grek40

+0

Hey @WahidBitar. Es hat gut funktioniert. Vielen Dank. Das einzige Problem ist, dass die Seite nicht zur Index Seite zurückgebracht wird, wie in 'Edit()' Methode angefordert, so bekomme ich * Diese Seite funktioniert nicht * Fehler nach. –

+0

Wenn Sie in der Methode keine asynchrone Arbeit haben, fügen Sie der Methode nicht das async-Schlüsselwort hinzu und verwenden Sie einfach 'return Task.FromResult ((object) null);' , damit Ihre Methode wie 'public Task' aussieht SomeMethod() {... zurückgeben Task.FromResult ((Objekt) null);} ' –

Antwort

1

Verwenden Sie nicht async void überhaupt.

wenn Sie verwenden möchten, async/await Muster dann Ihre Methoden lassen kehrt Task

public async Task UploadFiles(List<IFormFile> files)

+1

Wenn Sie nicht wissen, ob dies das Problem löst, dann stellen Sie es als ein Kommentar und fragen Sie das OP, ob es das tut oder nicht. Dann, wenn es so ist, poste es mit Zuversicht. – Enigmativity

Verwandte Themen