0

私は最も奇妙な問題を抱えています!

  1. MVC アプリケーションがあり、デフォルトの Microsoft 認証を使用しています。
  2. アプリを起動してユーザー登録しました。
  3. アプリケーションを閉じると、新しいデータベース (LocalDb)\v11.0 が接続されていることがわかりました。
  4. UserProfiles というテーブルを作成しました。

    CREATE TABLE UserProfiles
    (
        [Id] INT NOT NULL PRIMARY KEY, 
        [UserId] NVARCHAR(128) NULL, 
        [Email] NCHAR(10) NULL, 
        [DateCreated] DATETIME2 NULL, 
        [LastModified] DATETIME2 NULL, 
        [FirstName] NVARCHAR(50) NULL, 
        [LastName] NVARCHAR(50) NULL, 
        CONSTRAINT [FK_UserProfiles_AspNetUsers] FOREIGN KEY (UserId) REFERENCES [AspNetUsers](Id)
    )
    

    すべての列を UserProfile というクラスにコピーしました。

    public class UserProfile
    {
        [Key]
        [Required]
        [HiddenInput(DisplayValue = false)]
        public int Id { get; set; }
    
        [Required]
        [HiddenInput(DisplayValue = false)]
        //[Association("AspNetUser", "UserId", "UserId")] 
        public string UserId { get; set; } // Link with AspNetUsers user entry
    
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
    
        [DataType(DataType.DateTime)]
        public DateTime DateCreated { get; set; }
    
        [DataType(DataType.DateTime)]
        public DateTime LastModified { get; set; }
    
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
  5. EFDbContext クラスをセットアップします。

    class EFDbContext : DbContext
    {
        public DbSet<UserProfile> UserProfiles { get; set; }
    }
    
  6. 新しいプロファイル機能用にいくつかの編集ページとコントローラーをセットアップしました...最終的に、登録ユーザーとしてログインし、ユーザープロファイル/編集ページにアクセスすると、情報を入力できるようになり、保存を押すと呼び出されますcontext.SaveChanges()。

  7. ページを参照すると、すべての情報が残っていますが、URL にはすべてのプロファイルの詳細が含まれるクエリ パラメータが含まれています。から来ています...しかしいいえ...クエリパラメーターを削除してページを更新しても、ユーザープロファイルの編集フィールドに情報が入力されます...

だから、初めてうまくいったと思います。クールビーンズ!わくわくしながらデータベースを調べたところ、作成した UserProfiles テーブルにエントリがありませんでしたか?

では、このデータは、再呼び出しできるようにどこに保存されているのでしょうか?!?!?!

おそらく、作成されたデータベースはニシンであり、実際にはエンティティが別のデータベースに新しいテーブルを巧みにセットアップしたと思いましたが、私の web.config はそうではないと述べています:

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-James.WebUI-20131114020024.mdf;Initial Catalog=aspnet-James.WebUI-20131114020024;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

だから私の質問はです。私の美しいデータベースに保存されていない場合、データは一体どこに保存されているのでしょうか?

追加情報

ユーザープロファイルリポジトリ:

public class EFUserProfileRepository : IUserProfileRepository
{
    private EFDbContext context = new EFDbContext();

    public IEnumerable<UserProfile> UserProfiles { get { return context.UserProfiles; } }

    public void SaveUserProfile(UserProfile userProfile)
    {
        if (userProfile.Id == 0)
        {
            userProfile.DateCreated = DateTime.Now;
            userProfile.LastModified = DateTime.Now;
            context.UserProfiles.Add(userProfile);
        }
        else
        {
            UserProfile dbEntry = context.UserProfiles.Find(userProfile.Id);
            if (dbEntry != null)
            {
                dbEntry.Id = userProfile.Id;
                dbEntry.UserId = userProfile.UserId;
                dbEntry.LastModified = DateTime.Now;
                dbEntry.DateCreated = userProfile.DateCreated;
                dbEntry.Email = userProfile.Email;
                dbEntry.FirstName = userProfile.FirstName;
                dbEntry.LastName = userProfile.LastName;
            }
        }
        context.SaveChanges();
    }

    public UserProfile DeleteUserProfile(int userProfileId)
    {
        UserProfile dbEntry = context.UserProfiles.Find(userProfileId);
        if (dbEntry != null)
        {
            context.UserProfiles.Remove(dbEntry);
            context.SaveChanges();
        }
        return dbEntry;
    }
}

ユーザープロファイルコントローラー

public class UserProfileController : Controller
{
    private IUserProfileRepository repository = new EFUserProfileRepository(); // Remove this when Unity implemented

    public UserProfileController(/*IUserProfileRepository repo*/)
    {
        //repository = repo;
    }

    public ActionResult Index()
    {
        UserProfile userProfile = repository.UserProfiles.FirstOrDefault(uP => uP.UserId == User.Identity.GetUserId());
        if(userProfile == null)
        {
            return RedirectToAction("Create");
        }
        else
        {
            return RedirectToAction("Edit", userProfile);
        }
    }

    public ViewResult Edit()
    {
        UserProfile userProfile = repository.UserProfiles.FirstOrDefault(uP => uP.UserId == User.Identity.GetUserId());
        return View(userProfile);
    }

    [HttpPost]
    public ActionResult Edit(UserProfile userProfile)
    {
        if (ModelState.IsValid)
        {
            repository.SaveUserProfile(userProfile);
            TempData["Message"] = "The Profile has been succesfully edited";
            return RedirectToAction("Index");
        }
        else
        {
            return View();
        }
    }


    public ViewResult Create()
    {
        return View("Edit", new UserProfile { UserId = User.Identity.GetUserId() });
    }
}

ここに画像の説明を入力

ここに画像の説明を入力

Data Source=(LocalDb)\v11.0;AttachDbFilename="C:\Users\James\Documents\Visual Studio 2013\Projects\James\James.WebUI\App_Data\aspnet-James.WebUI-20131114020024.mdf";初期カタログ=aspnet-James.WebUI-20131114020024;統合セキュリティ=True

-------------実際のウェブサイト--------------

UserProfile/Edit ページにアクセスすると、次の URL に移動します。

...localhost:53417/UserProfile/Edit/4?UserId=********&Email=********&DateCreated=11%2F14%2F2013%2012%3A56%3A19&LastModified=11%2F14%2F2013%2013%3A07%3A05&FirstName=Jimmy&LastName=Trusler

したがって、ここから詳細が得られることは明らかです...しかし、その一連のクエリパラメーターを削除しても、ページは更新後も情報をレンダリングします。

...localhost:53417/UserProfile/Edit

ここに画像の説明を入力


@James : 私にはわかりません。

ここに画像の説明を入力


@ジェームズ:クッキーから来ている可能性が最も高いですが、なぜこれが起こっているのでしょうか。

ここに画像の説明を入力

4

1 に答える 1

1

データが取り込まれているあなたの Web ページは、ちょっとしたニシンです。実際の問題は、データが実際にはデータベースに保存されていないことです。テーブル ビューアーはそれを確認します。開発者ツールを使用してリクエストのネットワーク アクティビティを調べると、おそらくサーバーからのデータがないことがわかります。

フォーム情報はおそらくブラウザによってローカルに保存され(ローカルストレージ/ Cookieなど)、ページを更新すると再入力されるため、データがサーバーからプルされているように見えますが、そうではありません:)

于 2013-11-14T15:28:58.680 に答える