Podobnie jak kilka innych, próbowałem najpierw wdrożyć model tożsamości ASP.NET. Wszystko działa dobrze, gdy już spróbujesz, zmarnujesz, zmiażdżysz, przeszukasz i rozwiązałeś ... Pomyślałem.Model tożsamości ASP.NET Najpierw przestaje działać z powodu przemianowanych kolumn AspNetUserRoles
Zobacz także:
- ASP.NET Identity with EF Database First MVC5
- http://danieleagle.com/blog/2014/05/setting-up-asp-net-identity-framework-2-0-with-database-first-vs2013-update-2-spa-template/
kierunek działania, podsumował:
- Utworzono domyślny projekt (MVC5)
- tworzyć bazy danych
- Aktualizacja connectionString w web.config
- stronie Run, zarejestruj: Stoły dostać stworzony
- Tworzenie modelu EF (edmx)
- stoły importu Identity (wszystko w porządku aż do tego punktu)
- Modified xxx. Context.tt dziedziczyć z IdentityDbContext
- Generowanie skryptu bazy danych (kłopot zaczyna się tutaj)
mam rozwiązać problemy, które pojawiły się (do najnowszej kroku). Dla kompletności opiszę je.
Korzystanie z domyślnego kontekstu Identity
wszystko działa poprawnie: Stoły dostać tworzone, można zarejestrować i logowania. Nie jest to jednak sytuacja, którą chcę: chcę zastosować podejście modelowe.
Korzystanie zwyczaj, model pierwszy kontekst pomocą EF connectionString
Modyfikowanie CreatePerOwinContext tak, że używa mojego modelu Pierwszy kontekst:
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(CustomModelFirstDbContext.Create);
A ApplicationUserManager tak, że wykorzystuje model First kontekst:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<CustomModelFirstDbContext>()));
Wyniki w:
Server Error in '/' Application.
The entity type ApplicationUser is not part of the model for the current context.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: The entity type ApplicationUser is not part of the model for the current context.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace: [InvalidOperationException: The entity type ApplicationUser is not part of the model for the current context.]
Korzystanie z "normalnym" ConnectionString ze zwyczajem, model First kontekst
An exception of type 'System.Data.Entity.Infrastructure.UnintentionalCodeFirstException' occurred in WebApplication1.dll but was not handled in user code
Additional information: Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception.
Więc pomyślałem potrzebny kontekst domyślny Identity używać Tożsamość i użyć niestandardowego modelu First kontekst wszystko inne. Nie jest to preferowane rozwiązanie, ale dopuszczalne.
- walcowane wszystko z powrotem tabelach
- importu tożsamości z bazy
- (opcjonalne) utworzona podmiotów poprzez podejście modelu First
- Wygenerowany skrypt bazy danych
Zarówno normalne projektu i szybkiego rozsądku testowy projekt testowy ma taki sam problem z tabelą AspNetUserRoles. To jest tablica skrzyżowań, a podczas importowania jej do projektanta EF wszystko jest w porządku. Nie zobaczysz tego, ponieważ jest to wiele do wielu relacji, a podczas sprawdzania związku między AspNetRole i AspNetUser wygląda dobrze.
projektant i odwzorowania szczegółów:
Jednak podczas generowania skryptu SQL, EF modyfikuje klucze.
projektant i odwzorowania szczegółów:
wygenerowanego skryptu SQL:
-- Creating table 'AspNetUserRoles'
CREATE TABLE [dbo].[AspNetUserRoles] (
[AspNetRoles_Id] nvarchar(128) NOT NULL,
[AspNetUsers_Id] nvarchar(128) NOT NULL
);
GO
W EF, nie można zmienić nazwy odwzorowań w projektancie (thread on social.msdn.microsoft.com).
Następnie utworzenie nowego użytkownika wil nie korzystając z pierwotnie utworzony kontekst, ponieważ tabela zawiera błędne skrzyżowanie kolumny:
Server Error in '/' Application.
Invalid column name 'UserId'.
Invalid column name 'UserId'.
Invalid column name 'UserId'.
Invalid column name 'RoleId'.
Invalid column name 'UserId'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'UserId'. Invalid column name 'UserId'. Invalid column name 'UserId'. Invalid column name 'RoleId'. Invalid column name 'UserId'.
Source Error:
Line 89: {
Line 90: var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
Line 91: IdentityResult result = await UserManager.CreateAsync(user, model.Password);
Line 92: if (result.Succeeded)
Line 93: {
Jakie jest rozwiązanie? Czy są jakieś alternatywy, niż próba zmiany wygenerowanego skryptu, czy przejście do Code First?
Odpowiedziałem na to pytanie w komentarzach na moim blogu. Zobacz więcej szczegółów (danieleagle.com/blog/2014/05/setting-up-asp-net-identity-framework-2-0-with-database-first-vs2013-update-2-spa-template/) . Jeśli masz szczęście z moimi sugestiami, mogę zamieścić je jako odpowiedź na to pytanie. Chcę się upewnić, że jest to pomocne, aby reszta społeczności mogła odnieść z tego korzyści. –
Dziękujemy za szczegółową odpowiedź. Jeśli mogę podsumować, mówisz: (1) użyj Modelu Najpierw do projektowania encji i skryptu tworzenia bazy danych (2) użyj skryptu SQL wygenerowanego z Code First do tworzenia tabel i relacji tożsamości (3) nie stosuj podejścia Model First do projektowanie wszystkiego związanego z Tożsamością? Sugerowałoby to, że Identity and Model First nie jest w pełni funkcjonalny i wymagane jest obejście (takie jak twoje). – JeroenW
Tak, zgadza się. To jest mój obecny poziom zrozumienia. Byłbym bardzo szczęśliwy wiedząc, czy jest inny sposób. Rzeczywistość jest tym, w jaki sposób implementuje się Identity Framework 2.0 w oparciu o Code First. W tym momencie użycie go poza Code First wymaga nieco hakowania i użycia obejść. Mam nadzieję, że w przyszłych wydaniach ułatwią to. Jeśli ktokolwiek zna lepszy sposób, bardzo bym chciał to usłyszeć, bo jestem pewien, że równie dobrze. –