2012-08-22 32 views
13

Trong VS2010 thử nghiệm MSTest của tôi chạy tốt.Visual Studio 2012 thử nghiệm với csla và khung thực thể

Khi chạy trong VS2012 tôi gặp lỗi. Bài kiểm tra thiết lập Csla.ApplicationContext.User với một Hiệu trưởng Doanh nghiệp Tuỳ chỉnh. Khi EntityFramework được yêu cầu cung cấp một ObjectContext mới, tôi nhận được một SerializationException nói rằng không thể tìm thấy loại Principal Business Business của tôi.

Tất cả các thử nghiệm sử dụng EntityFramework không thành công khi chạy qua thử nghiệm của VS2012 hoặc thử nghiệm của Resharper7. Tôi đã thử chạy thử nghiệm của NCrunch và tất cả đều vượt qua.

Tôi làm cách nào để giải quyết vấn đề này?

+2

Tôi đã tìm thấy vấn đề thực sự của mình. VS2012 chạy các thử nghiệm trong một AppDomain riêng biệt và lớp truy cập dữ liệu của chúng tôi tải thông qua Reflection. Vẫn không chắc chắn lý do tại sao EF yêu cầu kiến ​​thức về hiệu trưởng nhưng giải pháp của chúng tôi là đặt lại hiệu trưởng của chúng tôi cho một GenericPrincipal trước khi truy cập EF rồi đặt lại bản gốc. Tôi vẫn vật lộn với ý nghĩ rằng có lẽ một container IoC sẽ làm giảm bớt vấn đề này. –

+0

Bạn có thể thêm phát hiện của mình làm câu trả lời và đánh dấu chúng là được chấp nhận nếu nó giải quyết được sự cố không? –

Trả lời

2

tôi thấy vấn đề thực sự của tôi. VS2012 chạy các thử nghiệm trong một AppDomain riêng biệt và lớp truy cập dữ liệu của chúng tôi tải thông qua Reflection. Vẫn không chắc chắn lý do tại sao EF yêu cầu kiến ​​thức về hiệu trưởng nhưng giải pháp của chúng tôi là đặt lại hiệu trưởng của chúng tôi cho một GenericPrincipal trước khi truy cập EF rồi đặt lại bản gốc. Tôi vẫn vật lộn với ý nghĩ rằng có thể một thùng chứa IoC sẽ làm giảm bớt vấn đề này

+0

Thực ra tôi không nghĩ EF muốn biết về hiệu trưởng của bạn một cách cụ thể, nhưng nó có thể nhìn vào nó, và khi nó cố gắng sửa đổi đối tượng từ appdomain ban đầu sang appdomain mới, nó không thành công (vì nó không thể tìm thấy lắp ráp hiệu trưởng của bạn được định nghĩa trong. – Andy

0

Bạn cũng nên lưu ý phương pháp tiếp cận chính của. 4.5. Im Sử dụng EF5.0 trên VS2012 nhắm mục tiêu .net4.5 mục tiêu .net4.5 kiểm tra sự khác biệt giữa WindowsIdentity.GetCurrent().Name;
Thread.CurrentPrincipal

tôi sử dụng một thói quen nhỏ như dưới đây HÌNH THỨC auth. Vì vậy, Windows Auth và Forms Auth có thể chơi cùng nhau.

Không giống hoàn cảnh chính xác, nhưng nó làm nổi bật sự khác biệt quan trọng bị bỏ qua khi mọi thứ hoạt động.
Worth thể đọc nhanh ... 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; 

    } 
} 
} 
Các vấn đề liên quan