9

Po utworzeniu ASP.NET MVC5 projekt (z ramy celem jest NET 4.5.1 oraz typ uwierzytelniania jest Indywidualne Konto użytkownika), więc to, co jest najbardziej elegancki sposób na skonfigurowanie projektu tak, aby utrzymywał użytkownika, roszczenia, role itp. w bazie danych Oracle 12c? Mam na myśli, w jaki sposób mogę zachować dane autoryzacji/uwierzytelniania w Oracle bez deformowania automatycznie generowanej struktury projektu MVC5.ASP.NET MVC5 - Utrzymanie Użytkownicy w Oracle Database

Chyba zmiana znacznika <defaultConnection> nie wystarczy i powinna istnieć kolejna implementacja Oracle, która zastąpi Microsoft.AspNet.Identity.EntityFramework. Byłoby bardzo pomocne zebranie odpowiedzi mówiącej, co zrobić krok po kroku od samego początku, gdzie projekt szablonu jest generowany przez VisualStudio (tj. Które referencje powinny zostać dodane do projektu, w jaki sposób plik Web.config powinien być ? ułożone Jeżeli tabele Oracle nazwać ściśle jak AspNetUsers, AspNetClaims itp czy mogę wstrzyknąć już istniejące nazwy tabel do strony kodowej)

Uwaga: Devart za dotConnect dla Oracle jest z moim zakresie, jak to jest nie darmowy produkt. Używam Oracle ManagedDataAccess do dostępu do baz danych i do korzystania z Entity Framework, ale korzystanie z logiki z bazą danych Oracle (bez głębokiej zmiany struktury klasycznego projektu MVC5) jest frustrujące dla mnie.

+0

Utknąłem również w tym problemie. Czy znalazłeś jakieś rozwiązanie? Czy podzielisz się swoim rozwiązaniem? – Ahsen

+0

Czy wypróbowałeś moje rozwiązanie? – LeftyX

Odpowiedz

6

Może to dla ciebie trochę za późno, ale zostawiam to na wypadek, gdyby ktoś inny wpadł na ten sam problem. W końcu udało mi się sprawić, że Identity 2.0 i Oracle będą ze sobą współpracować. Poniższe kroki działają, jeśli nie chcesz wprowadzać żadnych zmian w domyślnym IdentityUser (np. Jeśli masz w porządku posiadanie char ID zamiast int lub long) i chcesz tylko tabel na istniejącym schemacie Oracle.

  1. Tworzenie tabel tożsamości w Oracle. Możesz zmienić nazwy tabel, jeśli chcesz, po prostu upewnij się, że zawierają niezbędne kolumny Tożsamości, aby z nimi pracować.Można również dodać jakieś dodatkowe kolumny mogą być potrzebne na aplikacji (skrypt pierwotnie znaleźć na Devart, skopiowałem go na GIST w przerwach przypadek URL):

    Gist here

  2. Jeśli używasz EDMX plik, musisz dodać nowy ciąg połączenia, ponieważ ten, który zostanie wygenerowany automatycznie, nie będzie działał, potrzebujesz standardowego ciągu połączenia. Spróbuj następującego szablonu:

    <add name="IdentityContext" connectionString="Data Source=localhost:1521/xe;PASSWORD=password;USER ID=username;" providerName="Oracle.ManagedDataAccess.Client" />

  3. poinformować ApplicationDbContext do korzystania z nowego connectionString

    public ApplicationDbContext() 
        : base("IdentityContext", throwIfV1Schema: false) 
    { 
    } 
    
  4. Powiedz Tożsamość aby skorzystać z istniejącego schematu i tabel. Dodaj tę metodę wewnątrz definicji ApplicationDbContext znalezionego w IdentityModels.cs:

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        base.OnModelCreating(modelBuilder); // MUST go first. 
    
        modelBuilder.HasDefaultSchema("YOUR_SCHEMA"); // Use uppercase! 
    
        modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers"); 
        modelBuilder.Entity<IdentityRole>().ToTable("AspNetRoles"); 
        modelBuilder.Entity<IdentityUserRole>().ToTable("AspNetUserRoles"); 
        modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims"); 
        modelBuilder.Entity<IdentityUserLogin>().ToTable("AspNetUserLogins"); 
    } 
    
  5. odbudować i to wszystko!

Daj mi znać, czy to działa dla Ciebie!

+0

Uratowałem moje dni .. Pracowałem jak amulet –

+0

@Andres Bejarano Próbowałem wszystkich kroków, o których wspomniałeś, ale metoda OnModelCreating nigdy się nie wyrzuca. Wciąż otrzymuję komunikat o błędzie, gdy uruchamiam aplikację "Typ jednostki ApplicationUser nie jest częścią modelu dla bieżącego kontekstu." – WAQ

+0

@Andres Próbowałem wszystkich kroków, o których wspomniałeś, ale metoda OnModelCreating nigdy się nie uruchamia. Wciąż otrzymuję komunikat o błędzie podczas uruchamiania aplikacji Typ jednostki ApplicationUser nie jest częścią modelu dla bieżącego kontekstu. – WAQ

1

Możesz zaimplementować samodzielnie. To nie jest niemożliwe. Ktoś to zrobił: here i here. Mogło się trochę zmienić.

Wdrożyłem mój AspNet.Identity dla nhibernate i nie mam żadnego odniesienia do struktury encji. Nie mogę pokazać kodu, ale zasadniczo poszedłem za tym, co inni zrobili z RavenDb, Dapper lub nHibernate.

Trzeba wdrożyć:

  • użytkownika (Microsoft.AspNet.Identity.IUser)
  • Rola (Microsoft.AspNet.Identity.IRole)
  • UserStore (Microsoft.AspNet.Identity .IUserStore)
  • UserManager (Microsoft.AspNet.Identity.UserManager)
  • RolesStore (Microsoft.AspNet.Identity.IRoleStore)
  • RoleManager (Microsoft.AspNet.Identity.RoleManager)
2

Andres Bejarano pracował dla mnie świetnie, ale chcę dodać coś, co mogło by mi zająć dużo czasu. Najpierw upewnij się, że możesz połączyć się z bazą danych za pomocą Oracle.ManagedDataAccess.Client (miałem problemy z moim plikiem nazw TNS patrz OracleConnection.Open is throwing ORA-12541 TNS no listener).

Po drugie, ja otrzymuję następujący błąd, gdy próbowałem zarejestrować użytkownika:

No Entity Framework provider found for the ADO.NET provider with invariant name 'Oracle.ManagedDataAccess.Client'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

to dlatego, że nie mają wszystkie właściwe pakiety Nuget zainstalowane i/lub miałem pomieszane w internecie .config.

Sprawdź, czy masz zainstalowane ODAC http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html

Jeśli odinstalować/zainstalować ponownie następujące pakiety Nuget w porządku. należy ominąć ten błąd:

  1. UnInstall-Package Oracle.ManagedDataAccess.EntityFramework
  2. UnInstall-Package Oracle.ManagedDataAccess
  3. UnInstall-Package EntityFramework -version 6.1.1
  4. Install-Package EntityFramework - wersja 6.1.1
  5. Install-Package Oracle.ManagedDataAccess
  6. Install-Package Oracle.ManagedDataAccess.EntityFramework
+0

Rzeczy Oracle ManagedDataAccess są naprawdę godne uwagi - zwłaszcza podczas konfigurowania – vahdet

1

Tak, to stare pytanie, ale myślę, że jest przydatne, aby powiedzieć kilka rzeczy na ten temat. Odpowiedź Andresa Bejarano działała dla mnie, ALE są pewne rzeczy o wersjach dll. Dla Entity Framework 6 Na VS 2015 i dodane do projektu MVC odniesienie do poniższego dll:

  • Oracle.DataAccess.EntityFramework 6.121.2.0
  • Oracle.ManagedDataAccess 4.121.2.0
  • Oracle.managedDataAccess.EntityFramework 6.121.2.0.

Po tym należy napisać poprawne konfiguracje w pliku web.config w następujący sposób.
Pod koniec znacznika Configuration dodać:

<system.data> 
<DbProviderFactories> 
    <remove invariant="Oracle.ManagedDataAccess.Client" /> 
    <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
</DbProviderFactories> </system.data> 

W sekcji dostawcy dodatku:

<provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 

I oczywiście w sekcji connectionStrings trzeba umieścić ciąg połączenia dla Oracle: coś takiego:

<add name="IdentityContext" connectionString="Data Source=YOURDB;User Id=YOURUSER;Password=YOURPASSWORD;" 
    providerName="Oracle.ManagedDataAccess.Client" /> 

Przy tych konfiguracjach zmiany wprowadzone przez Andresa Bejorano zadziałały dla mnie bez zakłócania komunikacji z Nuget.