我有一个控制器需要从表单中提取数据并添加到数据库中。我之前已经做了很多次,但由于某些原因,在这个特定的代码部分,它根本不会保存。
我已经将信息提取到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>
}
答案 0 :(得分:0)
如果没有进一步的信息,可能会有一些事情。
本节:
ApplicationDbContext.RACIResChosenUser RACIResUser = new ApplicationDbContext.RACIResChosenUser();
将自定义对象保持在与raciResUser相同的范围内可能更容易,因为它的实例化对象与其复杂类型的情况相同。它很可能仍然有用,但这是一个问题。
在你的上下文中你应该有DbSet&lt; RACIResUser取代。如果不是那个问题。但你可能会这样做,因为通常你甚至看不到dbcontext.RACIResUser,如果不存在的话。
您的“迁移”需要是最新的。如果您刚刚添加了此POCO并且在数据库或其他地方丢失了它,则需要进行以下迁移:
dotnet ef migrations Add (yourMigrationName)
否则它不知道这些变化。
您确定您的连接字符串指向您认为将要访问的数据库吗?通常在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;");
}
}
这些设置与您想要的匹配,除非您想用其他位置覆盖此设置。