es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problemas al crear una conexión de entidad desde una conexión SQL.

Estamos convirtiendo nuestro acceso a la base de datos para usar Azure Identity con EF. Probé varios métodos diferentes y fallé porque EF espera que se cree un modelo y se pase en la cadena de conexión, lo cual no pude hacer con DBConnection. Finalmente encontré una forma de crear la EntityConnection a partir de una SQLConnection para poder conservar toda la información de la cadena de conexión original y agregar los metadatos según sea necesario. Aquí está mi código:

public static EntityConnection GetEntityConnectionString( string efConnectionString, string accessToken )
        {
            MetadataWorkspace workspace = new MetadataWorkspace( new string[] { "res://*/" }, new Assembly[] { Assembly.GetExecutingAssembly() } );

        SqlConnection sqlConnection = new SqlConnection( efConnectionString );
        sqlConnection.AccessToken = accessToken;
        EntityConnection entityConnection = new EntityConnection( workspace, sqlConnection );
        return entityConnection;
    }

Cuando ejecuto esto y llego a la línea

EntityConnection entityConnection = new EntityConnection( workspace, sqlConnection );

Obtengo el siguiente error:

System.ArgumentException: 'MetadataWorkspace must have EdmItemCollection pre-registered.'

No estoy seguro de qué hacer en este punto y realmente apreciaría cualquier visión que se pueda proporcionar.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error se debe a que el MetadataWorkspace no está configurado correctamente. El mensaje de error menciona que la EdmItemCollection debe registrarse previamente en el MetadataWorkspace.

    Una solución podría ser crear una EdmItemCollection y añadirla al MetadataWorkspace antes de crear la EntityConnection. Esto se puede hacer usando la clase EdmxReader para leer los metadatos desde el archivo .edmx y extraer la EdmItemCollection.

    Aquí tienes un ejemplo de cómo se puede hacer esto:

    public static EntityConnection GetEntityConnectionString(string efConnectionString, string accessToken, string metadataFilePath)
    {
        var connectionBuilder = new SqlConnectionStringBuilder(efConnectionString);
        var schema = connectionBuilder.InitialCatalog;
        var modelName = schema + ".Model";
        var metadata = new MetadataWorkspace(new string[] { "res://*/" }, new Assembly[] { Assembly.GetExecutingAssembly() });
        var csdl = string.Empty;
        var ssdl = string.Empty;
        var msl = string.Empty;
        using (Stream stream = new FileStream(metadataFilePath, FileMode.Open))
        {
            EdmxReader reader = new EdmxReader(stream);
            reader.Parse();
            csdl = reader.GetCsdl();
            ssdl = reader.GetSsdl();
            msl = reader.GetMsl();
        }
        var edmItemCollection = new EdmItemCollection(csdl);
        var storeItemCollection = new StoreItemCollection(ssdl);
        var storageMappingItemCollection = new StorageMappingItemCollection(edmItemCollection, storeItemCollection, msl);
        metadata.RegisterItemCollection(edmItemCollection);
        metadata.RegisterItemCollection(storeItemCollection);
        metadata.RegisterItemCollection(storageMappingItemCollection);
    
        var sqlConnection = new SqlConnection(connectionBuilder.ConnectionString);
        sqlConnection.AccessToken = accessToken;
        var entityConnection = new EntityConnection(metadata, sqlConnection);
        return entityConnection;
    }
    

    En este ejemplo, se utiliza la clase EdmxReader para leer los metadatos desde el archivo .edmx especificado en el parámetro metadataFilePath. Las secciones Csdl, Ssdl y Msl se extraen del archivo .edmx y se utilizan para crear la EdmItemCollection, StoreItemCollection y StorageMappingItemCollection. Estas colecciones se registran luego en el MetadataWorkspace antes de crear la EntityConnection.

    Ten en cuenta que también se utiliza el constructor del generador de cadenas de conexión para extraer el nombre del esquema, que se utiliza para crear el nombre del modelo en los metadatos.

    ¡Espero que esto sea de ayuda!

Comments are closed.