5

問題。登録シナリオでは、Userテーブルにユーザーを挿入してから、WebSercurity.CreateAccountそのユーザーを(トランザクションで)呼び出しようとしています。これにより、MSDTCがサーバーで利用できないというエラーが発生します。

説明。私がこれを行っている理由は、Customerから継承するエンティティがあるためです。そのため、レコードを認識せず、レコードを挿入するだけなUserので、WebSercurity.CreateUserAndAccount使用できません。CustomerUser

Asp.net MVC4をEntityFramework5、CodeFirst、およびSQL Server2008R2で使用しています。

DTCを使用しないための提案をいただければ幸いです。

編集。DbContextwebsecurityがデータベースへの独自の接続を使用し、リポジトリが別の接続を使用するため、このエラーが発生する理由は明らかです。ただし、リポジトリと同じクラス を使用するようにsimplemembershipを構成しましたが、問題は、 DbContext... _

既存のコンテキストオブジェクトを渡す方法、またはWebSecurityそのメソッドで使用するためのへの接続があるかどうかを期待していました。

コードは次のとおりです。

        if (ModelState.IsValid)
        {
            //using (TransactionScope tx = new TransactionScope())
            //{
                UnitOfWork.UserRepository.Insert(new Customer
                {
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    Email = model.Email,
                    Tel = model.Tel,
                    Mobile = model.Mobile,
                    BirthDate = model.BirthDate,
                    InsertDate = DateTime.Now,
                    UserType = UserType.Customer,
                    MaritalStatus = model.MaritalStatus,
                    ZipCode = model.ZipCode,
                    StreetAddress = model.StreetAddress,
                    City = model.City,
                    State = model.State
                });
                UnitOfWork.Commit();

                string token = WebSecurity.CreateAccount(model.Email, model.Password, true);

                Roles.AddUserToRole(model.Email, "Customer");
                //WebSecurity.Login(model.Email, model.Password, true);

                await Task.Run(() => EmailHelper.SendConfrimationEmail(token, model.Email));

            //  tx.Complete();
            //}
4

3 に答える 3

1

DTCエラーは、2つの異なるデータベース接続にトランザクションをまたがろうとしているために発生します。いくつかのオプションがあります。

SimpleMembershipは、単純なシナリオ向けに設計されています。高度なシナリオを実行しているため、おそらく別のメンバーシッププロバイダーを使用する必要があります。

于 2013-02-22T00:47:52.430 に答える
1

考えられる解決策を見つけましたが、それが最善の解決策かどうかはわかりません。このアイデアは、POCOエンティティにsimplemembershipテーブルを含め、(WebSecurityを使用せずに)自分でテーブルを作成する方法についてのこのブログ投稿から生まれました。

その結果、テーブルにレコードを挿入し、テーブルにCreateAccountレコードを挿入するだけで、リポジトリにメソッドを実装できると思います。and ...のような他のクエリについては、以前のように使用してクラス化できます。webpages_MembershipAddUserToRolewebpages_UsersInRolesGetUserWebSecurityRoles

それはうまくいくようです(そうでなければ私は何かが欠けています)が、私がしたくないいくつかの余分な仕事があります!

だから誰かが私にもっと良い解決策を与えることができれば私はうれしいです。

于 2013-02-22T18:10:24.277 に答える
0

Mystere Manが指摘したように、トランザクションが2つの異なるデータベースを介しているため、エラーが発生しています。いくつかのオプションがあります。ここに頭に浮かぶいくつかがあります。

SimpleMembershipプロバイダーが使用する既存のUserエンティティをカスタマイズして、各ユーザーに必要なカスタム情報を取得できます。これはかなり簡単で、このブログ投稿で説明されています。SimpleMembershipプロバイダーもサポートしている確認メールを送信しようとしているようです。ここで説明します

SimpleMembershipが使用する一意のユーザーID(int)を使用して、他のデータベースの情報を関連付けることもできます。ユーザーを作成してログインすると、WebSecurity.CurrentUserIdを呼び出してそのIDを取得できます。

SimpleMempershipプロバイダー全体をバイパスして、独自のカスタムメンバーシッププロバイダーを作成できます。これについては、ここで説明します

于 2013-02-22T18:36:59.973 に答える