【问题标题】:Table not incrementing after an insert in asp.net mvc在 asp.net mvc 中插入后表不递增
【发布时间】:2017-07-17 18:08:01
【问题描述】:

我正在开发一个 ASP.NET MVC 项目。我已经创建了在我的项目中使用的各种模型和视图模型。我还使用种子数据为我的数据库表播种,但在实现注册视图时,我测试了表单,但得到 0 作为插入数据库表的 Id 部分的值。我截断了表格并做了一个新的插入,但仍然有同样的错误。

下面是用户表的模型

public class User
{
    [Key]
    public byte Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string RefIndicator { get; set; }
    public Team TeamCategory { get; set; }
    public byte TeamId { get; set; }
    public bool IsRegistered { get; set; }
    public DateTime DateRegistered { get; set; }
    public DateTime? LastModified { get; set; }
    public UserRoles UserRoles { get; set; }
    public byte UserRolesId { get; set; }
}

下面是我为需要在视图中使用的团队模型属性创建的视图模型

public class RegisterFormViewModel
{
    public User Users { get; set; }
    public byte Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public IEnumerable<Team> Teams { get; set; }
    public byte TeamId { get; set; }
    public string RefIndicator { get; set; }
    public bool IsRegistered { get; set; }
    public DateTime DateRegistered { get; set; }
    public byte UserRolesId { get; set; }
}

这是用户控制器的注册操作,用于初始化注册视图的值

public ActionResult Register()
{
    var AppUser = User.Identity.Name.Substring(5);
    var AppUserEmail = AppUser + "@nlng.com";
    int index = AppUser.IndexOf('.');
    var FirstName = AppUser.Substring(0, index);
    var LastName = AppUser.Substring(index + 1);
    var IsRegistered = true;
    var UserRolesId = 1;
    var DateRegistered = HttpContext.Timestamp;

    var teams = _context.Team.ToList();

    var viewModel = new RegisterFormViewModel{
        Email = AppUserEmail,
        FirstName = FirstName,
        LastName = LastName,
        Teams = _context.Team.ToList(),
        IsRegistered = IsRegistered,
        UserRolesId = (byte)UserRolesId,
        DateRegistered = DateRegistered               
    };

    return View("Register", viewModel);
}

最后是注册页面的关联视图

@model eLeave.ViewModel.RegisterFormViewModel
@{
    ViewBag.Title = "Register";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>User Registration</h2>

@using (Html.BeginForm("Save", "User"))
{
    <div class="form-group">
        @Html.LabelFor(r=>r.FirstName)
        @Html.TextBoxFor(r => r.FirstName, new { @class = "form-control", @readonly = true })
    </div>

    <div class="form-group">
        @Html.LabelFor(r => r.LastName)
        @Html.TextBoxFor(r => r.LastName, new { @class = "form-control", @readonly = true })
    </div>

    <div class="form-group">
        @Html.LabelFor(r => r.Email)
        @Html.TextBoxFor(r => r.Email, new { @class = "form-control", @readonly = true })
    </div>

    <div class="form-group">
        @Html.LabelFor(r => r.TeamId)
        @Html.DropDownListFor(r => r.TeamId, new SelectList(Model.Teams, "Id", "TeamName"), "Select your Team", new { @class = "form-control" })
    </div>

    <div class="form-group">
        @Html.LabelFor(r => r.RefIndicator)
        @Html.TextBoxFor(r => r.RefIndicator, new { @class = "form-control" })
    </div>

    @Html.HiddenFor(m => m.IsRegistered)
    @Html.HiddenFor(m => m.DateRegistered)
    @Html.HiddenFor(m => m.UserRolesId)
    @Html.HiddenFor(m => m.Id)
@Html.AntiForgeryToken()
        <button class="btn btn-primary">Register</button>
    }

最后是 userController 的保存动作

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(User user)
{
    if (!ModelState.IsValid)
    {
        var viewModel = new RegisterFormViewModel
        {
            Users = user,
            Teams = _context.Team.ToList()
        };

        return View("Register", viewModel);
    }

    if (user.Id == 0)
    {
        _context.User.Add(user);
    }
    else
    {
        var usersInDb = _context.User.Single(m => m.Id == user.Id);
        usersInDb.FirstName = user.FirstName;
        usersInDb.LastName = user.LastName;
        usersInDb.TeamCategory = user.TeamCategory;
        usersInDb.RefIndicator = user.RefIndicator;
        usersInDb.UserRoles = user.UserRoles;
        usersInDb.IsRegistered = user.IsRegistered;
        usersInDb.Email = user.Email;
        usersInDb.DateRegistered = user.DateRegistered;
    }

    _context.SaveChanges();

    return RedirectToAction("Index", "User");
}

Save Action 基本上做了两件事......它保存了一个新表单,也用于更新数据。

如果我的代码中的错误可以被找出来,我们将不胜感激。

【问题讨论】:

  • 我不认为这是原因,但是您的UserIdbyte 类型,也许您应该使用Guid(又名UUID)或包含的字符串引导表示(甚至是int)。你在使用实体框架吗?
  • 你真的在你的表上定义了自动增量吗?因为我没有看到任何实际上会导致自动增量行为的东西..
  • 我使用 EF 代码优先方法来创建数据并将其播种到表中
  • @Alisson 是的,我正在使用实体框架
  • @Alisson 是的,我正在使用实体框架

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

据我了解,您需要将 ID 设为自动递增值。

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string RefIndicator { get; set; }
    public Team TeamCategory { get; set; }
    public byte TeamId { get; set; }
    public bool IsRegistered { get; set; }
    public DateTime DateRegistered { get; set; }
    public DateTime? LastModified { get; set; }
    public UserRoles UserRoles { get; set; }
    public byte UserRolesId { get; set; }
}

我认为它不适用于byte,但您可以肯定地使用int

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{        
    modelBuilder.Entity<User>().Property(a => a.Id).HasKey(b => b.Id);
    modelBuilder.Entity<User>().Property(a => a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}

【讨论】:

  • 我尝试了您的解决方案...这次 Id 值为 null,因此无法正常工作。
  • 因为不仅用户表需要更改,而且所有这些更改都需要迁移到数据库中。
  • 在 SQL 管理器中检查数据库是否有递增标志。如果不看上面的fluent api。
  • 其实我在this answer看到的,byte也可以作为Identity。
  • @Ssheverdin 我正在使用 Visual Studio 2013 安装附带的本地数据库。我如何在那里检查数据库管理器?应用程序完成后,我将部署到服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
相关资源
最近更新 更多