2011-02-09 15 views
5

Acabo de empezar a usar contratos de código en mi proyecto. Sin embargo, tengo un problema con la implementación de mi repositorio, que consulta mi base de datos utilizando Entity Framework..NET 4 Contratos de código: "require unproven: source! = Null"

que tienen el siguiente método:

public IEnumerable<Organization> GetAllOrganizations() 
{ 
    return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable(); 
} 

El método devuelve una colección que contiene todas las organizaciones en la base de datos, o una colección vacía que no hay organizaciones en la base de datos.

Sin embargo, esto no es aceptable de acuerdo a CodeContracts, que me dan el error: "no probada requiere: fuente = null"

¿Qué se trataba de decirme? Puedo satisfacer los contratos de código usando Contract.Assume, para asumir que siempre encontrará algo, pero luego tengo que hacer eso en todos los métodos que lean datos de la base de datos.

¿Me falta algo aquí, o es un comportamiento intencionado cuando se trabaja con bases de datos y LINQ?

+0

¿Qué es "fuente"? ¿Alguno de los métodos que está llamando tiene contratos? –

+2

¿Es [este] (http://stackoverflow.com/questions/3050279/how-to-avoid-source-null-when-using-code-contracts-and-linq-to-sql) pregunta alguna ayuda? – adrianbanks

+0

@Anon: No tengo idea de qué es "fuente". No estoy al tanto de si hay contratos sobre los métodos en el Entity Framework, pero no lo creo. @adrianbanks: No lo siento, no puedo ver cómo eso puede ayudarme. – Vern

Respuesta

2

Supongo que uno de los métodos CreateSet, OfType y AsEnumerable se declara como un método de extensión con un parámetro llamado "fuente", y CodeContrcts no puede probar que no es nulo. Además, ¿no necesita agregar una cláusula Require para especificar que _uow no es nulo en la entrada?

CreateSet parece ser el método de extensión, ya que no aparece en MSDN. Si el método no debe devolver null, puede cumplir esto mediante la adición de este contrato para CreateSet:

Contract.Ensures(Contract.Result<T>() != null); 

Cuando el analizador CodeContracts ve esta regla, se toma como prueba de que la entrada a OfType no será nulo, y la advertencia debería desaparecer

+0

Es muy probable que 'AsEnumerable', que tiene una condición previa' source! = Null'. No estoy seguro de si hay muchos (¿alguno?) Contratos sobre métodos en el Entity Framework, por lo que ni 'CreateSet' ni' OfType' tienen condiciones posteriores en ellos. Es posible que necesite crear sus propias funciones de contenedor. – porges

+0

Solo puede establecer una condición previa si la persona que llama el código es responsable de cumplir esa condición previa. En este caso, parece que _uow es una responsabilidad interna, no la de la persona que llama. – koenmetsu

+0

tiene razón en que necesito una cláusula Require para especificar que _uow no es nulo. Pero después de agregar que sigo recibiendo el error. @Porges: Creo que tienes razón en que AsEnumerable es la causa aquí. He hecho algunas pruebas con AsEnumerable y aquí también encontré el problema. Parece una tarea bastante tediosa escribir funciones de contenedor para muchas funciones: cuando se utilizan API de terceros que no usan contratos de código. Tendré que reconsiderar el uso de contratos de código en absoluto. – Vern

Cuestiones relacionadas