0

EFコアを使用するIdentity 3とIdentityDbContextを使用する.NETコアプロジェクトがあります。生成されたテーブルは、共通のSQLサーバーデータベースに格納されています。このデータベースは、EF6を使用する.NET 4.5.2 Framework DataLayerであるソリューション内の別のプロジェクトでも使用されています。IdentityプロジェクトでEFコアが使用され、クラスライブラリでEF6と同じデータベースが使用されている場合にユーザーにアクセスする方法

(ただ、いくつかのより多くの背景 - .NETのコアプロジェクトがOpenIdConnectとのOAuth2を実装するためにOpenIddictを使用して、我々はデータベースにユーザを保存して、ログインして認証できるようにアイデンティティで構成された認証サーバである)

認証が済むと、APIエンドポイントが呼び出されます。 APIはEF6で動作するDataLayerと通信します。このプロジェクトからは、ログインしたユーザーをフェッチして、さまざまなクエリのためにユーザーと作業する必要があります。理想的には、同じAspNetUsersテーブルを使用して拡張したかったのです。

ここで推奨されるアプローチは何ですか? EF6プロジェクトでUser DbContextを生成しようとすると、新しいマイグレーションを追加する必要があり、スキャフォールディングはデータベースにすでに存在する新しいテーブルを作成する必要があります。私は、2つの異なるプロジェクトで2つの別々のコンテキストを持つことと、これらがどのようにして「うまくやっていく」ことができるかについて少しは確信しています。

答えて

1

私はこれを動作させることができました。主な問題は、DotNet 4.51 DataLayerクラスライブラリプロジェクトのDotNet CoreプロジェクトのIdentity 3によって生成されたAspNetUsersテーブルにアクセスしたがっていることです。

これは、クラスライブラリEF 6プロジェクトでUser.cs Entityクラスを作成し、そのプロパティがIdentity 3で生成されたApplicationUser.csクラスの列と一致することを確認することで実現しました。

ユーザー。CS

 public class User{ 

    [Key] 
    public string Id { get; set; } 
    public int AccessFailedCount { get; set; } 
    public string ConcurrencyStamp { get; set; } 
    public string Email { get; set; } 
    public bool EmailConfirmed { get; set; } 
    public bool LockoutEnabled { get; set; } 
    public DateTimeOffset? LockoutEnd { get; set; } 
    public string NormalizedEmail { get; set; } 
    public string NormalizedUserName { get; set; } 
    public virtual string PasswordHash { get; set; } 
    public string PhoneNumber { get; set; } 
    public bool PhoneNumberConfirmed { get; set; } 
    public virtual string SecurityStamp { get; set; } 
    public bool TwoFactorEnabled { get; set; } 
    public string UserName { get; set; } 
} 

私はその後、私は私のユーザーエンティティのDbSetを追加AspNetUsersテーブルに

UserConfiguration.cs私DbContextクラスで

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     ToTable("AspNetUsers"); 
    } 
} 

をマッピングするEntityConfigurationを設定します。

public virtual IDbSet<User> Users { get; set; } 

次に、Add-Migrationコマンドを実行して、変更を足場に乗せました。生成されたら、私はコードをコメントアウトし、データベースに移行を適用しました。これにより、AspNetUsersテーブルの__MigrationsHistoryテーブルに行が生成されますが、テーブルの再作成は行われません。

私はその後、正常DataLayer EF6プロジェクトからAspNetUsersテーブルに話をすることができました:)

また、それは私がまた私のUser.csクラスにプロパティを追加することによって、今カスタム列でAspNetUsersテーブルを拡張することができるようですEF6 Datalayerプロジェクトで移行を実行します。

1

私は最近同様のシナリオを処理しました。私はこのアプローチに従った。

私は、アイデンティティ関連のリポジトリ/ストア、マイグレーション、DbContextを持つデータレイヤー用の別のクラスライブラリを持っています。 DbContextはホストプロジェクトから接続文字列を受け取ります。

.Netコアプロジェクトには、接続文字列がappSettings.jsonで指定されています。この接続文字列は同じデータベースを指します。このプロジェクトはIdentityServer3を実装し、トークンサービスとして機能します。

.Net 4.5.2プロジェクトに接続文字列がweb.configで指定されています。これは同じデータベースを指しています。このアプリは.netコアプロジェクトからトークンを取得し、そのBearer Tokenを使用して他のAPIにアクセスします。

エンティティを保持する別のプロジェクトを作成しましたが、このプロジェクトは.net core.netホストの両方で参照されています。

この方法では、2つのホストプロジェクト用に1つの共通データレイヤーがあり、2つのホストプロジェクト用に2つの異なるサービス/ビジネスレイヤーがあります。それは私にとってうまくいっている。

EF 7.0はシードをサポートしていないため、データベースにデータをシードするためのコンソールアプリケーションがあります。このコンソールアプリケーションでも、データレイヤーを介して同じデータベースにアクセスします。

3つの異なるプロジェクトが同じデータベースにアクセスしています。

自分のコードを公開することはできません。私はこれが役立つことを願っています

+0

ありがとう、私はこれを正しく理解していますか?.NETコアプロジェクトはID 3を使用し、.NET 4.5.2プロジェクトにはID 2がインストールされていますか?アイデンティティ2と3の両方がApplicationDbContextを作成します - このApplicationDbContextはDataLayerにありますか?次に、これらのプロジェクトの両方が、ApplicationDbContextから拡張されたDbContextを持つDatalayer(.Net 4.5.2)への参照を持っていますか?私が理解する限り、アイデンティティ3とアイデンティティ2はわずかに異なるデータベーススキーマを作成すると思っていたので、ちょっと混乱します。 – user1750537

+0

私の主な問題は、DataLayer .net 452 DbContextがID 3の.NETコアプロジェクトによって作成されたIDテーブルにアクセスできるようにすることです。 – user1750537

+0

ID 2と3はわずかなスキームの変更があります。ベースエンティティを作成し、追加のプロパティを持つ他のエンティティに派生させることで克服できるもの... ID 2と3に対して同じデータベースを使用したい場合は、すべての列をデータベースに格納する必要があります。他のバージョンのIDがこれらの列をサブセット化するように、どのエンティティをデータベースに入れる必要があるかを決定します。 – Venky

関連する問題