2017-09-11 1 views
-1

Dies scheint eindeutig ein anderes Problem als die Multithreading issue zu sein.Wenn Sie Unity DI verwenden, um Non DI Service mit Entity Framework hinzuzufügen

Verwenden von Unity mit Dependency Injection (DI) für alle meine Dienste und Verwenden eines Entitätsrahmenkontextes, der scheinbar initialisiert wird und ordnungsgemäß funktioniert.

Momentan verwenden Sie .net 4.5 mit mvc und Unity.WebApi und Entity Framework 6.0.0.0.

Ich möchte wissen, ob es möglich ist, einen Dienst in diesem Modell beizubehalten oder außerhalb von DI zu verwenden und in der Lage zu sein, das Entitätsframework im persistenten Dienst zu schließen und erneut zu initialisieren, wenn möglich.

Derzeit bekomme ich diesen Fehler, wenn ich versuche, einen Dienst durch eine Stack-Klasse zu persistieren, so dass seine Leistung sehr schnell sein wird b/c verwende ich häufiger.

The Error message I am getting is: Error Message: The underlying provider failed on Open. - The connection was not closed. The connection's current state is connecting.( at System.Data.Entity.Core.EntityClient.EntityConnection.Open() 

Zweck ist nur eine einzige Einheit abrufen und sehr schnell im Vergleich zu der Abhängigkeit injizierte Version machen laden und die Ergebnisse durch einen Service aus. Die Entität ist für Protokollierungszwecke an eine SQL-Tabelle gebunden. Hier

ist Code-Schnipsel, warum ich versuche zu beharren Dienst zu tun:

using System; 
using System.Linq; 

using Davinci.Models; 

namespace Services.Services 
{ 
    public interface ILogService 
    { 
     void SaveLog(UserLog log); 
     UserLog RetreiveLog(DateTime dateTime); 
    } 

public class LogService : ILogService 
{ 
    private DavinciEntities _DavinciEntities; 

    public LogService(DavinciEntities context) 
    { 
     _DavinciEntities = context; 
    } 

    private void SaveLog(UserLog log) 
    { 
     _DavinciEntities.UserLogs.Add(log); 
     _DavinciEntities.SaveChanges(); 
    } 

    public UserLog RetreiveLog(DateTime dateTime) 
    { 
     return _DavinciEntities.UserLogs.Where(m => m.LogTime.ToShortDateString() == dateTime.ToShortDateString()).FirstOrDefault(); 
    } 
} 

public static class PersistService 
{ 
    public static UserLogService userLogService {get; set;} 
    public static void PersistUserLog(UserLogService service) 
    { 
     IUserLogService UserLogService; 
     if (UserAccessLog == null) 
     { 
      UserLogService = (UserLogService)context.Configuration.DependencyResolver.GetService(typeof(UserLogService)); 
     } 
    } 
} 

}

+1

Können Sie einige Code-Snippets posten? – ovation22

+0

Mögliches Duplikat von [Multithreading Entity Framework: Die Verbindung wurde nicht geschlossen. Der aktuelle Status der Verbindung wird hergestellt] (https://stackoverflow.com/questions/12521695/multithreading-entity-framework-the-connection-was-not-closed-the-connections) – CodeCaster

+0

Zeigen Sie den _minimal_-Code an, der zur Reproduktion des Problems erforderlich ist , wie in [mcve] erklärt. Teilen Sie auch Ihre Forschung wie in [fragen] erläutert. Dieser Fehler hängt mit der Wiederverwendung einer alten DbContext-Instanz zusammen, deren Verbindung geschlossen wurde, indem sie nicht ordnungsgemäß entsorgt wird und/oder eine falsche Lebensdauer in Ihrem DI-Container angegeben wird. Zeigen Sie, wie Sie diese Klassen konfigurieren und verwenden. – CodeCaster

Antwort

0

Da ich eine Kopie meines Dienstes mit meiner Einheit DbContext gespeichert hatte es wurde, weil es andernfalls wurde von mehreren Threads verwendet. Der Fix bestand darin, es jedes Mal neu zu erstellen, da es ursprünglich von einer Unity-DI-Resolver-Methode stammte und die Entität nicht jedes Mal neu erstellt wurde, wenn der gespeicherte Dienst und seine Methoden aufgerufen wurden.

Sein nicht bekannt, ob der aktuelle Kontext, eine andere oder bessere Art und Weise geklärt werden, um es schneller ausführen, wenn mit einem bestimmten Anwendungsfall Szenario in einem bestimmten Web-api Gewinde oder Endpunkt statt newing es nach oben in jedem Methodenaufruf abgeschlossen des gespeicherten Dienstes.

Lösung jedes Mal seines in einer statischen Variablen gespeichert und bei jedem Verfahren wiederverwendet:

// some service 
public class SomeSerivce : ISomeService 
{ 
... 
    // when the service is stored must use new context liberally 
    public void SomeStaticMethod() { 
     _DavinciEntities = new DavinciEntities(); 
    ... // work 
    } 
} 

Ein Beispiel, wo dies könnte Filter oder globale Filter wäre erforderlich.