2016-11-19 12 views
0

現在、ユーザー用の同じデータベースにアクセスする複数のアプリケーションをリファクタリングしています。それぞれはユーザーに独自の特別なプロパティを追加し、多くのヌル値をもたらします...私はこれが気に入らないのです。私のアイデアは、アプリケーションごとに独自のIdentityUser、dbContextおよびUserManagerを使用することでした。 基本IdentityUserがあり、他のIdentityUserがそれから派生しています。それは次のようになります。ASp.net Entity Framework複数のIDユーザーエンティティ

ベースのユーザー:

public class User : IdentityUser 
{ 
    public string Username {get;set;} 
    public string Email {get;set;} 
    ... 
} 

このユーザーのdbContextとのUserManager:

[Table("User2")] 
public class User2 : User 
{ 
    public string SpecialProperty1 {get;set;} 
    public string SpecialProperty2 {get;set;} 
} 

public class User2Manager : UserManager<User2> 
{ 
    // code here 
} 

public class User2AuthenticationDbContext : IdentityDbContext<User2> 
{ 
    //code here 
} 

public class UserAuthenticationDbContext : IdentityDbContext<User> 
{ 
    //code here 
} 

public class UserManager : UserManager<User> 
{ 
//code here 
} 

第二のユーザのために、私は次のことをやりました

User2テーブルには、たとえば2つのプロパティしかありません。 User2の主キーはUser Tableと同じで、FKも同じです。

asp.net mvcプロジェクトでは、私はUser2関連のクラスのみを使用します。今すぐこのアプリケーションを起動すると、「無効な列名SpecialProperty1とSpecialProperty2」という瞬時にエラーメッセージが表示されます。 エンティティフレームワークは、この追加のフィールドを持たないユーザーテーブルにアクセスしているようです。それをUser2 Tableと「マージ」せずにUser2エンティティを返します。 これを達成するために何ができるのですか、それを行う方法が異なる/より良い方法がありますか?

私の主な目標は、この複数のアプリケーションに対してこれをより明確に分離し、すべてのアプリケーションが同じデータベースにアクセスすることです。あなたが持っている必要がありますどのような

答えて

0

は次のとおりです。

public IDbSet<BaseUser> Users 
: - : - あなたがのようなものを持っているでしょう、あなたのデータレポ、

class BaseUser 
class User1 : BaseUser 
class User2 : BaseUser 
etc 

XYZ.Infrastructure.DataRepository.DLL (Class Library)

XYZ.Business.Enities.DLL (Class Library)あなたのユーザークラスを定義する場所

そのDLLに基づいて、データベーススキーマ(EFコードファースト)を生成します。 Discriminator列(可能なタイプ:BaseUser、User1、User2など)のUsersテーブルがあります。

お使いのアプリケーションで同じ共通Entitiesアセンブリを参照する必要があります。各アプリケーションで、特定のユーザータイプで作業します。

のApp1:

User1 user = new User1(); 
this.dataRepository.Users.Add(user); 

App2の:

User2 user = new User2(); 
this.dataRepository.Users.Add(user); 

App3起動: var users = this.dataRepository.Users.Where(user is User3)

ポイントは異なるアプリケーションが同じエンティティとリポジトリのDLLを参照する必要があります...です。

DataRepositoryの上に、一般的なユーザーレポを作成することができます。

public class UserRepository<T> where T : BaseUser 
{ 
    public UserRepository(IDataRepository dataRepository) 
    { 
    } 

    // ... expose underlying dataRepository.Users here, while enforcing the T 
} 

の線に沿って何か、あなたはアプリで持つことができます。

var userRepo = new UserRepository<User1>(this.DataRepository); 
+0

あなたの答えをありがとうございました。私はそれをすべてのアプリケーションからアクセスできるように独自のクラスライブラリに入れました。あなたの例では、すべてが1つのテーブルに収まるでしょうか?型名などを保持する列で区切られています。 TablePerTypeでこれを行う方法はありますか?たとえばここのように:https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tptこれは私です私の例では、すべてのユーザーが同じテーブルになり、EFは、レコードが識別子列に基づいて、自動的にそのテーブルにあるかを決定します – metabolic

+0

...実行しようとしましたが、私は、MVCアプリケーションでのエラーメッセージが表示されます。各クラスのプロパティごとに列があります。重複したくない場合は、継承クラスと共通基底クラスが必要です。しかし、あなたはいつもいくつかのタイプのレコードには関係のないいくつかのNULLカラムを持つことになります - これはあなたを気にしません。 –

+0

なぜデータベースについて考えていますか?あなたがEFコードの最初のアプローチに行くならば、それはあなたを悩ますものであってはなりません。 –

関連する問題