2016-05-23 22 views
0

Probleme mit dem Erstellen von Modell für SQL-Server-Master-DB. ich ausgewählt Datenbank zuerst, brachte keine Objekte enthalten, also habe ich ein leeres Modell:Abfrage auf Master-Datenbank wirft UnintentionalCodeFirstException in DatabaseFirst

masterModel.cs:

*//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated from a template. 
// 
//  Manual changes to this file may cause unexpected behavior in your application. 
//  Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------* 

masterEntities.cs:

public partial class masterEntities 
    { 

    static masterEntities() 
    { 
     // don't let EF modify the database schema... 
     Database.SetInitializer<masterEntities>(null); 
    } 

    public masterEntities(string connectionString) 
     : base(connectionString) 
    { 

    } 
} 

Das Ziel ist, um eine Abfrage gegen die Master-Datenbank auszulösen, um herauszufinden, ob der aktuelle Benutzer serveradmin-Rechte besitzt (um später eine neue Datenbank zu erstellen):

public bool UserHasAdminPrivilegesAtDatabaseServer(DatabaseServer databaseServer) 
    { 

     var sqlBuilder = new SqlConnectionStringBuilder 
     { 
     DataSource = databaseServer.Server, 
     InitialCatalog = "master", 
     PersistSecurityInfo = true, 
     IntegratedSecurity = true, 
     MultipleActiveResultSets = false, 


     }; 

     //assumes a connectionString name in .config of MyDbEntities 
     var entityConnectionStringBuilder = new EntityConnectionStringBuilder 
     { 
     Provider = "System.Data.SqlClient", 
     ProviderConnectionString = sqlBuilder.ConnectionString, 
     Metadata = "res://*/masterModel.csdl|res://*/masterModel.ssdl|res://*/masterModel.msl", 

     }; 

     var connstring = entityConnectionStringBuilder.ProviderConnectionString; 

     using (var context = new masterEntities(connstring)) 
     { 
     const string sql = "SELECT IS_SRVROLEMEMBER('sysadmin')";//"SELECT IS_SRVROLEMEMBER('sysadmin')"; 

     var a = context.Database.SqlQuery<int>(sql).FirstOrDefault(); 
     return a == 1; 

     } 
    } 

Das Problem ist jetzt, dass EF das Ereignis OnModelCreating feuert, die wie folgt in DatabaseFirst Modus implementiert:

using System; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 

    public partial class masterEntities : DbContext 
    { 
     public masterEntities() 
      : base("name=masterEntities") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

    } 

und hier sind wir: neue UnintentionalCodeFirstException werfen(); Irgendwie möchte EF einige Sachen in der Master-DB erstellen; Selbst wenn wir die globale statische Eigenschaft festlegen, sollte dies nicht der Fall sein und das Modell selbst ist leer: Database.SetInitializer<masterEntities>(null);

Antwort

0

fand die Antwort hier:

private static string GetConnectionString(string model, string providerConnectionString) 
{ 

    var efConnection = new EntityConnectionStringBuilder(); 
    // or the config file based connection without provider connection string 
    // var efConnection = new EntityConnectionStringBuilder(@"metadata=res://*/model1.csdl|res://*/model1.ssdl|res://*/model1.msl;provider=System.Data.SqlClient;"); 
    efConnection.Provider = "System.Data.SqlClient"; 
    efConnection.ProviderConnectionString = providerConnectionString; 
    // based on whether you choose to supply the app.config connection string to the constructor 
    efConnection.Metadata = string.Format("res://*/correctModel.{0}.csdl|res://*/correctModel.{0}.ssdl|res://*/correctModel.{0}.msl", model); 
    // Make sure the "res://*/..." matches what's already in your config file. 
    return efConnection.ToString(); 
} 

Erklärung Sie

Die Ausnahme erhalten (Kredit reckface geht) ist, weil, wenn Sie weitergeben: https://stackoverflow.com/a/26120762/5172266

die MetaData korrekt ausgefüllt werden müssen Bei einer reinen SQL-Verbindungszeichenfolge wird davon ausgegangen, dass Sie zuerst mit Code arbeiten, sodass das OnModelCreation-Ereignis aufgerufen wird. Wenn Sie den MetaData-Abschnitt wie oben gezeigt einschließen, teilt das EF mit, dass es sich um eine vollständige EF-Verbindungszeichenfolge handelt.