2012-08-22 41 views
13

在VS2010中,我的MSTest测试运行得很好。Visual Studio 2012用csla和实体框架测试

在VS2012中运行时出现错误。测试将Csla.ApplicationContext.User设置为自定义业务主体。当EntityFramework被要求提供一个新的ObjectContext时,我收到一个SerializationException,说我的自定义业务主体类型找不到。

所有使用EntityFramework的测试在通过VS2012的测试运行器或Resharper7的测试运行器运行时都会失败。我已经尝试过NCrunch的测试跑步者,他们都通过了。

我怎样才能解决这个问题?

+2

我发现我真正的问题。 VS2012在单独的AppDomain中运行测试,我们的数据访问层通过Reflection进行加载。仍然不确定为什么EF需要委托人的知识,但我们的解决方案是在访问EF之前将我们的委托人重置为GenericPrincipal,然后放回原始。我仍然在想,也许一个IoC容器可以缓解这个问题。 –

+0

您是否可以将您的调查结果添加为答案,并将其标记为已接受,如果它解决了问题? –

回答

2

我找到了我真正的问题。 VS2012在单独的AppDomain中运行测试,我们的数据访问层通过Reflection进行加载。仍然不确定为什么EF需要委托人的知识,但我们的解决方案是在访问EF之前将我们的委托人重置为GenericPrincipal,然后放回原始。我仍然在想,也许一个IoC容器会缓解这个问题

+0

其实我不认为EF想知道你的委托人的具体情况,但它可能会查看它,并且当它试图将对象从原始appdomain湿润到这个新的时候,它会失败(因为它无法找到你的委托人在你的委员会中定义 – Andy

0

您还应该注意.net 4.5声明的主要方法。 IM在VS2012使用EF5.0目标.net4.5目标.net4.5 测试WindowsIdentity.GetCurrent().Name;
Thread.CurrentPrincipal

之间的区别我用一个小的程序是这样下的窗体身份验证。 因此Windows身份验证和表单身份验证可以一起玩。

不完全相同的情况,但它确实突出显示了一切正常工作时忽略的重要区别。
值得一快速阅读... 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; 

    } 
} 
} 
相关问题