14

在 VS2010 中,我的 MSTest 测试运行良好。

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

通过 VS2012 的测试运行器或 Resharper7 的测试运行器运行时,所有使用 EntityFramework 的测试都会失败。我已经尝试过 NCrunch 的测试运行程序,它们都通过了。

我该如何解决这个问题?

4

2 回答 2

3

我发现了我真正的问题。VS2012 在单独的 AppDomain 中运行测试,我们的数据访问层通过反射加载。仍然不确定为什么 EF 需要了解主体,但我们的解决方案是在访问 EF 之前将我们的主体重置为 GenericPrincipal,然后放回原始主体。我仍然在思考 IoC 容器可能会缓解这个问题

于 2012-11-09T13:47:24.917 回答
0

您还应该注意 .net 4.5 声明主体方法。WindowsIdentity.GetCurrent().Name;
我在 VS2012 上使用 EF5.0 目标 .net4.5 目标 .net4.5 测试和 之间的区别 Thread.CurrentPrincipal

我在 Forms auth 下使用了一个像这样的小程序。所以 Windows Auth 和 Forms Auth 可以一起玩。

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

   }
}
}
于 2012-10-05T03:33:31.070 回答