2011-06-08 9 views
3

コードを最初にMVC3プロジェクトでMVCメンバーシッププロバイダーを拡張しようとすると、奇妙なエラーが発生します。MVCメンバーシップの問題 - C#、EntityFramework

エラーは以下のとおりです。

EntityType 'MembershipUser' has no key defined. Define the key for this EntityType. 

EntitySet "MembershipUsers" is based on type "MembershipUser" that has no keys defined 

私は、標準的なasp.netメンバーシップを設定しますが、外部キーがaspnet_UsersでユーザーIDフィールドであるUserDetailsと呼ばれる余分なテーブル&モデルを追加しました。

エントリがusersテーブルに挿入されると、私はUserIdを取得し、Useretailsテーブルに他の詳細を入力しようとしますが、これはエラーが表示されるときです。ここに他の関連コードがあります。 AccountController:

if (createStatus == MembershipCreateStatus.Success) 
      {      
       //Add other user details 
       UserRepository _user = new UserRepository(); 
       UserDetails userDetails = new UserDetails(); 

       userDetails.EmployeeNumber = Request.Form["EmployeeNumber"]; 
       userDetails.Title = Request.Form["Title"]; 
       userDetails.FirstName = Request.Form["FirstName"]; 
       userDetails.Initials = Request.Form["Initials"]; 
       userDetails.Surname = Request.Form["Surname"]; 
       userDetails.Nino = Request.Form["Nino"]; 

       _user.AddUserDetails(userDetails, model.Email); 
       return RedirectToAction("Welcome", "Home"); 
      } 

UserRepository:

public MembershipUser GetUserByEmail(string email) 
    { 
     MembershipUser user = Membership.GetUser(email); 
     return user; 
    } 


    public void AddUserDetails(UserDetails userDetails, string email) 
    { 
     MembershipUser user = GetUserByEmail(email); 
     Guid userGuid = (Guid)Membership.GetUser(email).ProviderUserKey; 
     userDetails.UserID = userGuid; //Add UserID foreign key 
     using (IntranetApplication db = new IntranetApplication()) 
     { 
      db.UserDetails.Add(userDetails); 
      db.SaveChanges(); 
     } 
    } 

db.SaveChangesライン上のエラーが発生します。

MemberShipユーザーはクラスそのものであり、エンティティフレームワークの一部ではないため、どのように私がUserIDを主キーとして設定できるか知っていますか?私はデータベースをチェックインしており、すでに設定されているので、コード内でどのように修正できるか分かりません。

ありがとう - ご協力ありがとうございました

答えて

3

Craigが言っていることを広げるために、メンバーシップテーブルとリンクするのが便利だとわかっていますが、それは必要ではありません。クエリとして、ユーザーIDフィールドをパラメータとして受け入れ、次にそれをMembership.GetUser()。ProviderUserKeyから渡します。

また、あるユーザーが特定の名前のユーザーを作成してから削除した後、同じ名前の新しいユーザーが作成されると、セキュリティ上の問題が発生する可能性があるため、 。

+0

私は新しいテーブルとメンバーシップテーブルとの関係を取り除き、コード内のリンクを削除しましたが、それはまだ起こっています。これは私のMVCの未経験かもしれませんが、メンバーシップテーブルからuserIDを使用して行を入力するだけで、UserDetailsテーブルの修正を行っているのであれば、その特定のモデル(UserDetailsなど)データベース全体ではなく? –

+0

Doh!私は1つの参照を削除していない - 私は今それを削除し、それは正常に動作しています。あなた自身とCraigに感謝します。 –

4

あなたは2つの問題があります。

  1. MembershipUserのマッピングでは、暗黙的にまたは明示的にキーが定義されていません。マッピングコードは表示されませんが、それはエラーの内容です。
  2. とにかくMembershipUserをマップするべきではありません。

(2)は、(1)種類の関係がないため、ここで最も重要な点です。 You should never depend on the SQL Provider DB tables。また、制御しないので、MembershipUserをエンティティとして使用しないでください。を実行する人は、それをそのまま使用するつもりはありません。

メンバーシップデータをEF経由で直接入力するのではなく、メンバーシップAPIから取得します。