2012-08-22 11 views
13

In VS2010 il mio test MSTest viene eseguito correttamente.Test di Visual Studio 2012 con csla e framework di entità

Durante l'esecuzione in VS2012, si verifica un errore. Il test imposta Csla.ApplicationContext.User con un Principal Business personalizzato. Quando EntityFramework viene richiesto di fornire un nuovo ObjectContext, ricevo un SerializationException che dice che non è possibile trovare il tipo di Business Principal personalizzato.

Tutti i test che utilizzano EntityFramework falliscono quando si esegue il test runner di VS2012 o il runner di prova di Resharper7. Ho provato il runner di NCrunch e tutti passano.

Come posso risolvere questo problema?

+2

Ho trovato il mio vero problema. VS2012 esegue i test in un AppDomain separato e il livello di accesso ai dati viene caricato tramite Reflection. Ancora non sono sicuro del motivo per cui EF richiede la conoscenza del principale, ma la nostra soluzione è stata quella di ripristinare il nostro principio su GenericPrincipal prima di accedere a EF e quindi rimettere l'originale. Sto ancora lottando con il pensiero che forse un container IoC potrebbe alleviare questo problema. –

+0

Puoi aggiungere i risultati come risposta e contrassegnarli come accettati se risolvono il problema? –

risposta

2

ho trovato il mio vero problema. VS2012 esegue i test in un AppDomain separato e il livello di accesso ai dati viene caricato tramite Reflection. Ancora non sono sicuro del motivo per cui EF richiede la conoscenza del principale, ma la nostra soluzione è stata quella di ripristinare il nostro principio su GenericPrincipal prima di accedere a EF e quindi rimettere l'originale. Sto ancora lottando con il pensiero che forse un container IoC allevierebbe questo problema

+0

In realtà non credo che EF voglia conoscere il tuo principal in modo specifico, ma potrebbe guardarlo, e quando tenta di eseguire il marshing dell'oggetto dall'appodominio originale a quello nuovo, fallisce (dato che non riesce a trovare il assemblaggio il tuo principale è definito in. – Andy

0

Si dovrebbe anche notare l'approccio principale di rivendicazioni .net 4.5. Im Utilizzando EF5.0 su VS2012 mira .net4.5 obiettivo .net4.5 prova la differenza tra WindowsIdentity.GetCurrent().Name;
e Thread.CurrentPrincipal

Io uso un po 'di routine come questo sotto FORMA auth. Quindi Auth Auth di Windows e Form può giocare insieme.

Non esattamente la stessa situazione, ma evidenzia l'importante differenza che viene trascurata quando tutto funziona correttamente.
Merita una lettura veloce ... 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; 

    } 
} 
}