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ć?
Możliwy duplikat [Merge MyDbContext z IdentityDbContext] (http://stackoverflow.com/questions/19764233/merge-mydbcontext-with-identitydbcontext) – Arvand
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? –