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. 我为新的配置文件功能设置了一些编辑页面和控制器......最终,当我以注册用户身份登录并访问 UserProfile/Edit 页面时,我现在可以填写信息,当我点击保存时它会调用context.SaveChanges()。

  7. 当我 refrssh 页面时,所有信息仍然存在,尽管 url 现在已经获得了查询参数,其中包含我的所有个人资料详细信息......这很废话,但我认为我的数据库一定有问题,这就是信息所在来自...但是没有...如果我删除查询参数并刷新页面,我仍然会收到信息填写我的用户配置文件的编辑字段...

所以我想,哇,它第一次奏效。酷豆!我兴奋地看着我的数据库……然后在我创建的 UserProfiles 表中发现 NO ENTRY?

那么这些数据到底存储在哪里以便能够被调用?!?!?!

我想也许创建的数据库是一个红鲱鱼,事实上实体已经巧妙地在一个单独的数据库中设置了一个新表,但我的 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() });
    }
}

在此处输入图像描述

在此处输入图像描述

数据源=(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;集成安全=真

-------------实际网站--------------

访问时的 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:我不知道,我现在真的感觉我的深度不够了

在此处输入图像描述


@James:很可能来自cookie,但为什么会发生这种情况,我没有告诉它......至少显式

在此处输入图像描述

4

1 回答 1

1

您正在填充的网页有点红鲱鱼 - 真正的问题是您的数据从未真正保存到数据库中 - 您的表格查看器证实了这一点。如果您使用开发人员工具检查请求的网络活动,您可能会发现没有来自服务器的数据。

表单信息可能由浏览器本地存储(例如本地存储/cookies)并在您刷新页面时重新填充,因此看起来好像数据是从服务器中提取的 - 但它不是:)

于 2013-11-14T15:28:58.680 回答