5

私はasp.netmvc3を初めて使用します

標準のasp.netメンバーシッププロバイダーを介して追加のユーザー情報を保存しようとしています。新しいエンティティUserAddressを作成し、メンバーシップAPIを使用してaspnet_tablesと同期します。

ただし、UserAddressクラスに変更を加えても、asp.netはモデルを削除して再作成しません。エラーが発生します

使用中のため、データベースを削除できません。

私はstackoverflowとgoogleを検索しました。基本的に、私の問題はこれに似ています

EntityFramework4コードファーストで使用中のデータベースエラー

しかし、私はクリスが解決策として提案するものを実装する方法がわかりません:

「これは、DBに対してMembershipメソッドを呼び出していたために発生し、競合が発生していました。Membershipシステムを使用する前に、イニシャライザーを強制的に実行してシードすることで、これを解決しました。」

私のコードはデータリポジトリのこの時点でフォールオーバーするため、これがデータベースが使用されている理由であると確信しています。

var userid = Membership.GetUser.ProviderUserKey.ToString();
return db.UserAddress.SingleOrDefault(a => a.UserId == userid);

メンバーシップシステムの前にイニシャライザを強制的に実行するにはどうすればよいですか?

私のコードの抜粋は以下のとおりです。

public class UserAddress
{
    public int UserAddressId { get; set; }
    public string UserId { get; set; }
    public string FlatNo { get; set; }
    public string BuildingName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string PostCode { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Country { get; set; }
    public long MobilePhone { get; set; }
}

public class NPLHWebsiteDb : DbContext
{
    public DbSet<UserAddress> UserAddress { get; set; }
}

public class NPLHWebsiteInitializer : DropCreateDatabaseIfModelChanges<NPLHWebsiteDb>
    {
        protected override void Seed(NPLHWebsiteDb context)
        {
            var userAddress = new List<UserAddress>
            {
                new UserAddress {
                    UserAddressId = 1,
                    UserId = "153",
                    FlatNo = "6.4",
                    BuildingName = "Wilton Plaza",
                    MobilePhone = 9810110123,
                }
            };
            userAddress.ForEach(a => context.UserAddress.Add(a));
            context.SaveChanges();
    }

ありがとう

4

5 に答える 5

7

SQL Server Management Studioを使用してSqlExpressデータベースに接続し、プロジェクトを開始したときにいくつかのクエリを開いたときに、この問題が発生しました。

これが実行している場合は、プロジェクトを開始する前に、SSMSのデータベースから切断してみてください。

于 2012-08-09T02:43:55.707 に答える
5

疑われるように、犯人は「メンバーシップ」でした。

このコードは、メンバーシップを使用して、ログインしているユーザーのアドレスを検索します。したがって、Webサイトにログインすると、メンバーシップテーブルが呼び出され、SQLでは、現在使用されている(つまり、メンバーシップによって)テーブルを削除して再作成することはできません。

これは、元の質問でリンクしたスタックオーバーフローの質問でChrisが指摘したものとまったく同じです。

基本的に、解決策は、メンバーシップが呼び出される前にデータベースを強制的に初期化することでした。どうすればいいのかわからなかった。URLを入力してユーザーアドレスページにアクセスすることにより、手動で実行しようとしました。ただし、メンバーシップテーブルを呼び出す行で再び失敗したため、これは機能していませんでした。

これを行う正しい方法は、次のようにアプリケーションの初期化を強制的に開始することでした。

System.Data.Entity.Database.SetInitializer(new MyInitializer());          
MyContext db = new MyContext();         
db.Database.Initialize(true);
于 2012-08-09T13:24:19.777 に答える
0

コントローラーはどのreturn db.UserAddress.SingleOrDefault(a => a.UserId == userid);ように見えますか。

やってみますreturn db.UserAddress.SingleOrDefault(a => a.UserId == userid).ToList()

そして、問題を解決することを確認してください。

于 2012-08-09T02:15:02.790 に答える
0

Global.asaxのApplication_Start()にイニシャライザーがあるので、最初に発生しますか?

protected void Application_Start() {
    Database.SetInitializer(new NPLHWebsiteInitializer());
}
于 2012-08-09T00:27:01.990 に答える
0

私は最初にエンティティフレームでMVC4コードを使用しています。メンバーシップを別のデータベースにApplication_Start()移動し、Tripingのコードをに追加し、SSMSを使用せず、コードをstartメソッドの先頭に移動しました。(別の)マークが言うように、それでもエラーが発生しました。

https://stackoverflow.com/a/7007818/2332919をフォローして接続文字列に追加することで解決しました。これによりPooling=false、もう一度やり直すことができましたが、どのくらいの費用がかかりますか?

于 2013-06-22T14:13:18.170 に答える