Χρησιμοποιούσα ένα αρχείο .mdf
για τη σύνδεση με μια βάση δεδομένων
και ένα entityClient
. Τώρα θέλω να αλλάξω τη συμβολοσειρά σύνδεσης έτσι ώστε να μην υπάρχει αρχείο .mdf
.
Είναι σωστό το ακόλουθο connectionString
;
<connectionStrings>
<!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />-->
<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>,
Επειδή λαμβάνω πάντα το σφάλμα:
Ο υποκείμενος πάροχος απέτυχε στο Open
Είχα αυτό το σφάλμα και βρήκα μερικές λύσεις:
Κοιτάζοντας τη συμβολοσειρά σύνδεσής σας, φαίνεται έγκυρη. Βρήκα αυτή τη δημοσίευση στο ιστολόγιο, το πρόβλημα εδώ είναι ότι χρησιμοποιούσαν Integrated Security. Εάν εκτελείτε το IIS, ο χρήστης του IIS χρειάζεται πρόσβαση στη βάση δεδομένων.
Εάν χρησιμοποιείτε Entity Framework με συναλλαγές, το Entity Framework ανοίγει και κλείνει αυτόματα μια σύνδεση με κάθε κλήση βάσης δεδομένων. Έτσι, όταν χρησιμοποιείτε συναλλαγές, προσπαθείτε να κατανείμετε μια συναλλαγή σε πολλαπλές συνδέσεις. Αυτό ανεβαίνει στο MSDTC.
(Δείτε αυτή την αναφορά για περισσότερες πληροφορίες.)
Αλλάζοντας τον κώδικά μου στον ακόλουθο κώδικα, το πρόβλημα διορθώθηκε:
using (DatabaseEntities context = new DatabaseEntities())
{
context.Connection.Open();
// the rest
}
Το context.Connection.Open()
δεν βοήθησε στην επίλυση του προβλήματός μου, οπότε δοκίμασα να ενεργοποιήσω το "Allow Remote Clients" στο DTC config, δεν υπάρχει πλέον σφάλμα.
Στα windows 7 μπορείτε να ανοίξετε το DTC config εκτελώντας το dcomcnfg, Component Services -> Computers -> My Computer -> Distributed Transaction Coordinator -> Δεξί κλικ στο Local DTC -> Security.
Διαπίστωσα ότι το πρόβλημα ήταν ότι είχα τη διαδρομή του διακομιστή μέσα στη συμβολοσειρά σύνδεσης σε μία από αυτές τις παραλλαγές:
SERVER\SQLEXPRESS
SERVER
Ενώ στην πραγματικότητα θα έπρεπε να έχω:
.\SQLEXPRESS
Για κάποιο λόγο έλαβα το σφάλμα κάθε φορά που δυσκολευόταν να εντοπίσει την περίπτωση της SQL.