Подтвердить что ты не робот

Проверка Visual Studio 2012 с использованием инфраструктуры csla и entity

В VS2010 мой тест MSTest работает нормально.

При работе в VS2012 я получаю сообщение об ошибке. Тест устанавливает Csla.ApplicationContext.User с пользовательским бизнес-директором. Когда EntityFramework просят предоставить новый объект ObjectContext, я получаю исключение SerializationException, в котором не указано, что тип пользовательского бизнес-принципа не найден.

Все тесты, использующие EntityFramework, терпят неудачу при запуске тестового бегуна VS2012 или тестового бегуна Resharper7. Я пробовал тест-драйв NCrunch, и все они проходят.

Как я могу решить эту проблему?

4b9b3361

Ответ 1

Я нашел свою реальную проблему. VS2012 запускает тесты в отдельном AppDomain, а наш уровень доступа к данным загружается через Reflection. Все еще не уверен, почему EF требует знания принципала, но наше решение было до reset нашего принципала к GenericPrincipal до доступа к EF, а затем откладывание оригинала. Я все еще борюсь с мыслью, что, возможно, контейнер IoC облегчит эту проблему.

Ответ 2

Вы также должны отметить основной подход заявки .net 4.5. Im Использование EF5.0 в VS2012 для таргетинга .net4.5 target.net4.5 проверьте разницу между WindowsIdentity.GetCurrent().Name;
и 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;

   }
}
}