2016-04-02 25 views
5

Tôi đang sử dụng mẫu ASP.Net MVC mặc định trong Visual Studio. Tôi đang sử dụng mã ASP.Net Identity đã được tạo cho tôi trong mẫu. Tôi muốn cho DBContext tôi sử dụng để nhận thức được mối quan hệ giữa thực thể ApplicationUser (bảng AspNetUser) và phần còn lại của các thực thể của tôi. Ví dụ, tôi muốn có thể có một thuộc tính ApplicationUser.Messages thể hiện mối quan hệ giữa các thực thể ApplicationUser và Message. Tôi có DbContext của tôi cho tất cả các thực thể không nhận dạng trong một dự án lớp truy cập dữ liệu. Và mẫu ApplicationDbContext nằm trong lớp UI. Để giữ mối quan hệ giữa các thực thể Identity và các thực thể tùy chỉnh của tôi, tôi cần phải hợp nhất vào một DbContext, đúng không? Làm thế nào để tôi làm điều này?Sáp nhập ASP.Net Identity DbContext với DbContext của tôi

Dưới đây là một số mẫu mã của những gì tôi có:

Các IdentityUser và DbContext tạo ra cho tôi trong UI lớp dự án từ mẫu MVC với tin nhắn tùy chỉnh của tôi sở hữu:

public class ApplicationUser : IdentityUser 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 

    public ICollection<Message> Messages { get; set; } 
} 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
} 

Lớp nhắn tôi có trong domain/Business logic lớp của tôi:

public class Message 
{ 

    public int Id { get; set; } 

    [Required] 
    public string Title { get; set; } 

    [Required] 
    public string Body { get; set; } 

    [Required] 
    public DateTime Created { get; set; } 
} 

Các DBContext tôi có trong lớp dự án Data Access của tôi:

public class PSNContext : DbContext, IPSNContext 
{ 
    public PSNContext() 
     :base ("DefaultConnection") 
    { 
    } 

    public DbSet<Message> Messages { get; set; } 
} 

Nó không cảm thấy quyền mang mã UI cụ thể như thế này từ ApplicationUser trong UI lớp vào kinh doanh của tôi logic lớp:

var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 

Có cách nào tốt hơn để làm điều này?

+0

Bản sao có thể có của [Hợp nhất MyDbContext với IdentityDbContext] (http://stackoverflow.com/questions/19764233/merge-mydbcontext-with-identitydbcontext) – Arvand

+0

Câu hỏi là đúng. Tôi đang phải đối mặt với vấn đề tương tự. Tôi không muốn duy trì hai DbContexts, một trong lớp UI và một trong lớp DataAccess của tôi. Nếu tôi chuyển các lớp ASP.NET Identity sang DataLayer, tôi cũng phải di chuyển không gian tên System.AspNet.Identity sang DataLayer và tôi muốn Lớp dữ liệu của mình độc lập với công nghệ UI. Có đúng không gian tên "AspNet" trong Lớp dữ liệu không? –

Trả lời

1

này đã được trả lời here

Liên quan đến di chuyển ApplicationUser thành một lớp logic, cá nhân tôi nghĩ rằng nó là tốt. Logic không sử dụng các không gian tên cụ thể của Web. Những cái được sử dụng là Microsoft.AspNet.Identity và System.Security.Claims có liên quan. Trong trường hợp này ApplicationUser là thực thể, lớp web của bạn nên sử dụng ClaimsPrincipal để xác thực và ủy quyền.

Nếu bạn muốn có ví dụ, trước tiên tôi đã hợp nhất previously done this. Mặc dù nó không ở trạng thái lý tưởng, nó sẽ là một ví dụ cho những gì bạn đang cố gắng đạt được.

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