我正在尝试将数据添加到数据库中,并且出现此错误

时间:2018-07-19 07:17:10

标签: c# asp.net model-view-controller

自创建数据库以来,支持“ DonorContext”上下文的模型已更改。考虑使用代码优先迁移来更新数据库 我哪里出错了?

这是我的控制人

  public class RegisterController : Controller
{
    private DonorContext dc = new DonorContext();
    // GET: Register
    public ActionResult Create()
    {
        return View();
    }

    [HttpPost]
    [AllowAnonymous]
    public ActionResult Create(RegisterModel registerModel)
    {
        if (ModelState.IsValid)
        {
            dc.RegisterModel.Add(registerModel);
            dc.SaveChanges();
            return RedirectToAction("Login","Account");
        }
        return View();
    }
}

这是我的模特

 public class RegisterModel
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

这是我的DAL

 public class DonorContext : DbContext
{
    public DbSet<DonorModel> DonorModel { get; set; }
    public DbSet<RegisterModel> RegisterModel { get; set; }
}

2 个答案:

答案 0 :(得分:0)

这只是意味着您的模型已与数据库不同步,可能如果您查看数据库,您可能会发现列或类似内容有所不同。

默认情况下,实体框架只会将其报告为错误,但是您可以更改此行为。

建议您先打开代码优先迁移(see here for process),这样做的好处是,您可以使用 Update-Database 命令(在软件包管理器控制台中)进行更新数据库模式。

也可以让此程序在您的应用程序运行时自动运行,但是在处理数据库模式时,我建议您谨慎行事。理想情况下,您希望在更改数据库之前确保模型完全符合您的要求

答案 1 :(得分:0)

  

自从开始以来,支持“ DonorContext”上下文的模型已更改   数据库已创建。考虑使用代码优先迁移进行更新   数据库

如果您使用的是代码优先迁移

之前,您已经实现并建模

public class RegisterModel
{
    public string Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
} 

现在您通过更改任何属性数据类型或根据需要添加任何属性来更改模型,例如

public class RegisterModel
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

在这里,我将属性“ Id”的数据类型从字符串更改为整数

然后在运行项目时发生上述错误

问题:为什么出现上述错误?

答案: 用简单的语言

在Entity Framework代码优先迁移中,您始终在数据库中看到“ _MigrationHistory”表,因此该表包含在启用向项目的迁移时所做的所有条目。 如果更改任何模型属性或数据类型,则这些模型与“ _MigrationHistory”表中的条目不匹配 因此,实体框架会引发异常,因此会出现错误。

再次

问题:如何摆脱该错误?

答案:只需打开软件包管理器控制台,然后输入“ update-database -verbose”,然后按Enter键。

注意:-verbose提供您现在所做的控制台上所有更改的详细信息。 在此之前,请确保可能会丢失数据。