2017-02-28 3 views
2

私はASP.NET Identity 2.0を使用しています。現在、私はApplicationUserを共有プロジェクトから適切な関係を設定する方法を拡張する

など FirstNameのようなテーブル UserDetailsによって ApplicationUserUsersAspNetUsersに改称)を拡張したいと思い、私の問題は何ですか? EFモデルを格納するクラスライブラリプロジェクトを分離しました。私は別のEFモデルを生成するのは嫌いです(必要でない場合)。

私はUsersテーブルとUserDetailsテーブルの間にSQL Serverの関係がありますが、それは問題ありません。残念ながら、ASPプロジェクトのUsersテーブルでは、IdentityUserのどこか深くハードコードされています。つまり、IdentityUserを継承するApplicationUserがあることを意味します。私がしようとしています何

AppDbContextである:

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    base.OnModelCreating(builder); 

    // Ignore columns 
    builder.Entity<ApplicationUser>().Ignore(c => c.PhoneNumberConfirmed); 

    // Rename tables 
    builder.Entity<ApplicationUser>().ToTable("Users"); 
    builder.Entity<IdentityRole>().ToTable("Roles"); 
    builder.Entity<IdentityRoleClaim<string>>().ToTable("IdentityRoleClaims"); 
    builder.Entity<IdentityUserClaim<string>>().ToTable("IdentityUserClaims"); 
    builder.Entity<IdentityUserLogin<string>>().ToTable("IdentityUserLogins"); 
    builder.Entity<IdentityUserToken<string>>().ToTable("IdentityUserTokens"); 

    // Relationship 
    builder.Entity<ApplicationUser>() 
     .HasOne(p => p.UserDetails) 
     .WithOne(i => i.Users) 
     .HasForeignKey<Shared.Database.UserDetails>(u => u.UserID); 
} 

問題がWithOne(i => i.Users)で最後の行にある、i.UsersApplicationUserではありません。面白いことは、ApplicationUseri.Usersのような同じプロパティを持っているということです。D

だから私はそれを正しく関係を作るために変換する方法を知る必要があります。

これを解決する方法はありますか?または、それを別の方法で行う方法についてアドバイスしますか?

共有プロジェクトは1つの追加プロジェクト(WCF)で使用されているので、私はIdentityUserから継承そこに置くことができません:/

みんなありがとう。

答えて

2

2つの異なるオブジェクトを1つの同じデータベーステーブルにマップし、別のエンティティFKをそのテーブルにマッピングしたいとします。 ADNあなたは、最初の部分で何の問題もないが、2番目とのトラブルを抱えて:

問題はi.UsersApplicationUserない、WithOne(i => i.Users)で最後の行にあります。面白いのはApplicationUseri.Usersのような同じ性質を持っているということです。D

2つの解決策があります。

  1. UserDetailsクラスからナビゲーションプロパティを削除し、単に両方の場所WithOne()で使用しています。
  2. 次のようにあなたがそのナビゲーションプロパティを必要とする場合は、あなたはIdentityクラスの構造と同様のアプローチを使用することができますが:

が共有プロジェクトで、現在持っているUserDetailsクラスは次のようになりましょう

public class UserDetails 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    // other properties ... 
    public string UserID { get; set; } 
    public User User { get; set; } // the problematic navigation property 
} 

あなたは、一般的なクラスに変換することができます

public class UserDetails<TUser> where TUser: class 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    // other properties ... 
    public string UserId { get; set; } 
    public TUser User { get; set; } 
} 

と古い非ジェネリッククラスは、単純に継承させます

public class UserDetails : UserDetails<User> { } 

共有プロジェクトEFモデルのすべてが以前と同じである必要があるため、それを使用する他のプロジェクト(WCF)は影響を受けません。

あなたはすでにポイントを得ていると思います。

public class ApplicationUserDetails : UserDetails<ApplicationUser> { } 

を、あなたがUsersApplicationUserをマッピングされた方法に類似UserDetailsテーブルにマップ:ASPプロジェクトで、あなただけの別のクラスを作成します

builder.Entity<ApplicationUserDetails>().ToTable("UserDetails"); 

次にApplicationUserUserDetailsナビゲーションプロパティを変更しますクラス:

public ApplicationUserDetails UserDetails { get; set; } 

最後に、任意のプロとの関係を設定しますblem:

builder.Entity<ApplicationUser>() 
    .HasOne(u => u.UserDetails) 
    .WithOne(d => d.User) 
    .HasForeignKey<ApplicationUserDetails>(d => d.UserID); 
+0

これは私が探していた答えですが、残念ながらそれはどのように行うのかではありません。なぜなら、常にエンティティの関係に何らかのエラーが発生するからです。私はそれを完全に再設計しなければならない。とにかくおかげで:) – user1085907

+0

あなたが歓迎されて、うれしいことは助けた。私はそれを問題の本当の解決策にしたいと思っていましたが、あなたの実際のケースにどのような影響があるのか​​よくわかりませんが、私はあなたがもっとよく知っていると思います:) –

+0

よくasp.netコアはado.netをサポートしていません私が考えた基本的なエンティティのフレームワークではうまく動作しません。だから私の次のステップは、これらの問題を解決するはずのエンティティフレームワークのコアに基づいてデータベースモデルを生成することです:) – user1085907

関連する問題