_context.add没有保存到数据库

时间:2018-03-06 17:11:16

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

我有一个控制器需要从表单中提取数据并添加到数据库中。我之前已经做了很多次,但由于某些原因,在这个特定的代码部分,它根本不会保存。

我已经将信息提取到console.writeline并检查它是否是正确的信息。我也试过添加虚拟数据,但没有什么可以保存。我也尝试过只使用_console.Add();, _ console.Add(RACIResUser);, _context.RACIResUser.Add(RACIResUser),但没有保存。正如我所说的,我可以在控制台中查看所有正确的信息,页面上表单的其他部分保存到数据库中的不同表中,只是这部分不会保存。

代码如下: 后控制器:

[HttpPost]
public async Task<IActionResult> InstanceProcess(string InstanceId, [Bind(Prefix="SectionInfo")]IEnumerable<ProcessOutput> secinf)
{
        var res = (from i in _context.SOPRACIRes
                   select new ProcessOutput { SOPTemplateID = i.soptoptempid, valuematch = i.valuematch, JobTitleId = i.JobTitleId, DepartmentId = i.DepartmentId }).ToList();
                    ViewBag.res = res;
foreach (var item in secinf)
  {
    foreach (var data in (ViewBag.res))
        {
           ApplicationDbContext.RACIResChosenUser RACIResUser = new ApplicationDbContext.RACIResChosenUser();
           var sel = Request.Form[data.valuematch + "-RES"];

          Console.WriteLine("Dropdown res:");
          Console.WriteLine(sel);
          int onevalue = Convert.ToInt32(sel);

          var status = "Pending";

          RACIResUser.RACIResID = data.valuematch;
          RACIResUser.UserId = onevalue;
          RACIResUser.Status = status;

          RACIResUser.soptoptempid = data.SOPTemplateID;
          RACIResUser.InstanceId = getid;

          Console.WriteLine("data valuematch:");
          Console.WriteLine(RACIResUser.RACIResID);

          Console.WriteLine("data SOPTemplateID:");
          Console.WriteLine(data.SOPTemplateID);

          _context.RACIResUser.Add(RACIResUser);
          _context.SaveChanges();
        }
}
}

数据库上下文:

public class RACIResChosenUser {
     [Key]
     public int RACIResChosenID { get; set; }
     public string RACIResID { get; set; }
     public string Status {get; set;}
     public string StatusComplete { get; set; }
     public int UserId { get; set; }
     public string soptoptempid { get; set; }
     public string InstanceId { get; set; }
 }
 public DbSet<RACIResChosenUser> RACIResUser { get; set; }

CSHTML:

@foreach(var data in (ViewBag.res)){
  var dropname = item.valuematch + "-RES";
    <div class="col-12 col-md-6">  
       @Html.DropDownList(@dropname,ViewBag.selectlist as SelectList, new { @class = "form-control" })          
    </div>
}

1 个答案:

答案 0 :(得分:0)

如果没有进一步的信息,可能会有一些事情。

本节:

ApplicationDbContext.RACIResChosenUser RACIResUser = new ApplicationDbContext.RACIResChosenUser();
  1. 将自定义对象保持在与raciResUser相同的范围内可能更容易,因为它的实例化对象与其复杂类型的情况相同。它很可能仍然有用,但这是一个问题。

  2. 在你的上下文中你应该有DbSet&lt; RACIResUser取代。如果不是那个问题。但你可能会这样做,因为通常你甚至看不到dbcontext.RACIResUser,如果不存在的话。

  3. 您的“迁移”需要是最新的。如果您刚刚添加了此POCO并且在数据库或其他地方丢失了它,则需要进行以下迁移:

    dotnet ef migrations Add (yourMigrationName)
    

    否则它不知道这些变化。

  4. 您确定您的连接字符串指向您认为将要访问的数据库吗?通常在ASP.NET Core中,您可以在Startup.cs中连接它,它指向您的appSettings.json。如果你构成从DBContext继承的普通简单香草,你通常会有这样的部分:

       protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
       {
    
        if (!optionsBuilder.IsConfigured)
        {
    
           \#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
            optionsBuilder.UseSqlServer(@"Server=.;Database=db;Trusted_Connection=True;");
        }
    }
    
  5. 这些设置与您想要的匹配,除非您想用其他位置覆盖此设置。