c# .net entity-framework overloading entity-framework-6

c# - Error extraño de "ensamblaje no referenciado" al intentar llamar a una sobrecarga de método válida



.net entity-framework (1)

Estoy usando la sobrecarga de métodos en la Assembly A :

public static int GetPersonId(EntityDataContext context, string name) { var id = from ... in context... where ... select ...; return id.First(); } public static int GetPersonId(SqlConnection connection, string name) { using (var context = new EntityDataContext(connection, false)) { return GetPersonId(context, name); } }

Cuando trato de llamar a la segunda sobrecarga del Assembly B , VS produce el siguiente error de tiempo de compilación:

El tipo ''System.Data.Entity.DbContext'' se define en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado ''EntityFramework, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = ...''.

Assembly B referencia a la Assembly A Entity Framework está referenciado solo en la Assembly A ya que la Assembly B no lo usa. La llamada de la Assembly B ve así:

using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); var id = AssemblyA.GetPersonId(connection, name); // compiler error ... }

Lo que no entiendo es que el error desaparece si cambio la firma del método en el Assembly A a, por ejemplo:

public static int GetPersonId(SqlConnection connection, string name, bool empty)

y cambiar la llamada a:

var id = AssemblyA.GetPersonId(connection, name, true); // no error

¿Por qué mi código no se está compilando en el primer caso? No parece estar relacionado con Entity Framework como indica el error. Siempre he pensado que C # permite la sobrecarga de métodos donde las firmas de los métodos difieren solo en los tipos de parámetros. Por ejemplo, puedo ejecutar el siguiente código sin problemas como se esperaba:

static void DoStuff(int a, int b) { ... } static void DoStuff(int a, float b) { ... } DoStuff(10, 5); DoStuff(10, 5.0f);

Entonces, ¿por qué recibo el error en mi situación a pesar de las sobrecargas aparentemente legales?

Tenga en cuenta que desde la Assembly B no tengo problemas para llamar a otros métodos que utilizan EntityDataContext , la única diferencia es que estos métodos no tienen sobrecargas.

Fondo

EntityDataContext hereda el DbContext de EF:

public partial class EntityDataContext : DbContext { public EntityDataContext() : base("name=EntityDataContext") { } public EntityDataContext(DbConnection connection, bool contextOwnsConnection) : base(connection, contextOwnsConnection) { } ... }

Estoy utilizando .NET 4.0 con el código EF 6 primero en una base de datos existente con algunas sobrecargas de ctor personalizadas agregadas.


El estándar de C # especifica que la resolución de sobrecarga (sección 7.5.3) se realiza comparando cada firma coincidente para determinar cuál es el mejor ajuste. No dice qué sucede cuando falta una referencia, por lo que debemos inferir que todavía es necesario comparar los tipos sin referencia.

En su caso, el compilador necesita una referencia a EntityDataContext para poder comparar las dos sobrecargas. Su llamada coincide exactamente con la firma, por lo que, en teoría, no debería necesitar esto, pero el estándar no especifica ningún comportamiento de cortocircuito.