2016-04-02 16 views
5

Używam domyślnego szablonu ASP.Net MVC w Visual Studio. Używam kodu tożsamości ASP.Net, który został utworzony dla mnie w szablonie. Chciałbym używać DBContext, którego używam, aby być świadomym związku między jednostką ApplicationUser (tabela AspNetUser) a resztą moich encji. Na przykład chcę mieć właściwość ApplicationUser.Messages, która wykazuje relacje między użytkownikiem ApplicationUser a jednostkami Message. Mam DbContext dla wszystkich obiektów spoza tożsamości w projekcie warstwy dostępu do danych. A szablon ApplicationDbContext znajduje się w warstwie interfejsu użytkownika. Aby zachować relacje między jednostkami tożsamości a moimi niestandardowymi podmiotami, muszę połączyć się w jeden DbContext, prawda? Jak mam to zrobic?Scalanie tożsamości ASP.Net DbContext z moim DbContext

Oto przykładowy kod, co mam:

IdentityUser i DbContext stworzony dla mnie w projekcie UI warstwy z szablonu MVC z moim niestandardowych komunikatów nieruchomości:

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(); 
    } 
} 

klasy Message mam w mojej domenie/Biznes Logic warstwy:

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; } 
} 

DBContext mam w moim projekcie warstwy dostępu do danych:

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

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

on nie czuje się prawo do wniesienia kod UI specyficzne tak z ApplicationUser w warstwie UI do mojego logiki biznesowej warstwy:

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

Czy istnieje lepszy sposób to zrobić?

+0

Możliwy duplikat [Merge MyDbContext z IdentityDbContext] (http://stackoverflow.com/questions/19764233/merge-mydbcontext-with-identitydbcontext) – Arvand

+0

Pytanie jest prawidłowe. Mam do czynienia z tym samym problemem. Nie chcę utrzymywać dwóch DbContextów, jednego w warstwie interfejsu użytkownika i drugiego w warstwie DataAccess. Jeśli przeniesię klasy tożsamości ASP.NET do DataLayer, muszę przenieść obszar nazw System.AspNet.Identity również do DataLayer i chcę, aby warstwa danych była niezależna od technologii interfejsu użytkownika. Czy poprawnie jest mieć przestrzeń nazw "AspNet" w warstwie danych? –

Odpowiedz

1

To już odpowiedział here

W odniesieniu do ruchu ApplicationUser w warstwie logiki, ja osobiście uważam, że jest w porządku. Ta logika nie wykorzystuje specyficznych dla sieci przestrzeni nazw. Te używane są Microsoft.AspNet.Identity i System.Security.Claims związane. W tym przypadku ApplicationUser jest jednostką, twoja warstwa sieciowa powinna używać ClaimsPrincipal do uwierzytelniania i autoryzacji.

Jeśli chcesz podać przykład, mam już przed sobą previously done this scalenie. Chociaż nie znajduje się w idealnym stanie, powinien służyć jako przykład tego, co próbujesz osiągnąć.

Powiązane problemy