2012-08-22 23 views
13

En VS2010 mi prueba MSTest funciona bien.Prueba de Visual Studio 2012 con csla y Entidad framework

Cuando se ejecuta en VS2012, me sale un error. La prueba establece Csla.ApplicationContext.User con un Custom Business Principal. Cuando se le pide a EntityFramework que proporcione un nuevo ObjectContext, recibo una SerializationException diciendo que no se puede encontrar el tipo de Custom Business Principal.

Todas las pruebas que usan EntityFramework fallan al ejecutar a través del corredor de prueba de VS2012 o el corredor de prueba de Resharper7. He probado el corrector de prueba NCrunch y todos pasan.

¿Cómo puedo resolver este problema?

+2

Encontré mi verdadero problema. VS2012 ejecuta las pruebas en un Dominio de aplicación separado y nuestra capa de acceso a datos se carga a través de Reflection. Todavía no estoy seguro de por qué EF requiere el conocimiento del principal, pero nuestra solución fue restablecer nuestro principal a un GenericPrincipal antes de acceder a EF y luego volver a colocar el original. Todavía estoy luchando con la idea de que tal vez un contenedor IoC alivie este problema. –

+0

¿Puede agregar sus hallazgos como respuesta y marcarlos como aceptados si resuelve el problema? –

Respuesta

2

encontré mi verdadero problema. VS2012 ejecuta las pruebas en un Dominio de aplicación separado y nuestra capa de acceso a datos se carga a través de Reflection. Todavía no estoy seguro de por qué EF requiere el conocimiento del principal, pero nuestra solución fue restablecer nuestro principal a un GenericPrincipal antes de acceder a EF y luego volver a colocar el original. Todavía estoy luchando con la idea de que tal vez un contenedor IoC aliviaría este problema

+0

En realidad, no creo que EF quiera saber específicamente sobre su principal, pero puede verlo, y cuando intenta eliminar el objeto del dominio de aplicación original de este nuevo, falla (ya que no puede encontrar el montaje su principal se define en – Andy

0

También debe tener en cuenta el enfoque principal de .net 4.5. Im Usando EF5.0 en VS2012 focalización .net4.5 objetivo .net4.5 prueba de la diferencia entre WindowsIdentity.GetCurrent().Name;
y Thread.CurrentPrincipal

que usar un poco de rutina de este tipo bajo formas de autenticación. Para que la Auth de Windows y la Autoformidad de formularios puedan jugar juntas.

No es exactamente la misma situación, pero resalta la diferencia importante que se pasa por alto cuando todo funciona.
Vale la pena una lectura rápida ... http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Security.Claims; 
using System.Security.Principal; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web; 


namespace BosIdentityManager 
{ 
public class BosPrincipal 
{ 
    /// <summary> 
    /// The current principal is set during FORMS authentication. If WINDOWS auth mode is in use, Windows sets it. 
    /// </summary> 
    /// <returns> The Name from Thread.CurrentPrincipal.Identity.Name unless alternate delegate is configured</returns> 
    public static string GetCurrentUserName() 
    { 
    // http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current 
    // with forms auth and windows integrated,ClaimsPrincipal.Current will be set. 

     var prin = ClaimsPrincipal.Current; //normally this reverts to Thread.CurrentPrincipal, but can chnage ! 
     return prin.Identity.Name; 

    } 

    public static string GetCurrentWindowsUserName() 
    { 
     return WindowsIdentity.GetCurrent().Name; 
    } 

    public static void SetPrincipal(BosMasterModel.Membership memb) 
    { 
     var claims = new List<Claim>(){ new Claim(ClaimTypes.Name, memb.SystemUser.UserName), 
             new Claim(ClaimTypes.NameIdentifier,memb.UserId.ToString()), 
             new Claim(ClaimTypes.Role, "SystemUser") }; 

     var ClaimsId = new ClaimsIdentity(claims,"Forms"); 

     var prin = new ClaimsPrincipal(ClaimsId); 
     Thread.CurrentPrincipal = prin; 

    } 
} 
} 
Cuestiones relacionadas