带有 ADO .NET 的 ASP .NET MVC 会导致问题吗?
Posted
技术标签:
【中文标题】带有 ADO .NET 的 ASP .NET MVC 会导致问题吗?【英文标题】:ASP .NET MVC with ADO .NET causing issues? 【发布时间】:2011-11-22 14:01:33 【问题描述】:我是 ADO .NET 和 MVC 的新手,我正在尝试做一些简单的事情,我正在编辑“DailyReport”,它基本上代表工作报告。
这是我的相关控制器模式:
//
// GET: /DailyReport/Edit/5
public ActionResult Edit(int id, int weeklyReportID, int day)
WeeklyReport weeklyReport = (
from WeeklyReport wr in db.WeeklyReports
where wr.Id == weeklyReportID select wr)
.FirstOrDefault();
ViewBag.Week = weeklyReport.Week;
ViewBag.Day = day;
return View();
//
// POST: /DailyReport/Edit/5
[HttpPost]
public ActionResult Edit(DailyReport dailyReport, int weeklyReportID, int day)
if (ModelState.IsValid)
db.SaveChanges();
if (dailyReport == null)
dailyReport = new DailyReport();
dailyReport.StartTime = new TimeSpan(7, 0, 0);
dailyReport.EndTime = new TimeSpan(7 + 8, 0, 0);
dailyReport.Day = day;
db.DailyReports.AddObject(dailyReport);
db.SaveChanges();
WeeklyReport weeklyReport = (
from WeeklyReport wr in db.WeeklyReports
where wr.Id == weeklyReportID select wr)
.FirstOrDefault();
if (!weeklyReport.DailyReport.Any(dr => dr.Id == dailyReport.Id))
weeklyReport.DailyReport.Add(dailyReport);
dailyReport.WeeklyReport = weeklyReport;
db.SaveChanges();
return RedirectToAction("Edit",
"WeeklyReport",
new
id = weeklyReportID,
week = weeklyReport.Week,
year = weeklyReport.Year
);
return View(dailyReport);
当我编辑日期时间值时,它不会被保存。在我调试它的 HttpPost 部分中,确实更改了对象以反映这些更改,但调用 db.SaveChanges() 不会将其提交到数据库。
Edit 在这种情况下,“db”是我的 ADO .NET 上下文,声明方式如下:
ActivesEntities db = new ActivesEntities();
ActivesEntities 有这个声明:
public partial class ActivesEntities : ObjectContext ...
【问题讨论】:
顺便说一句,与问题无关,让控制器直接调用数据库绝不是一个好主意......将你的代码分成几层:***.com/questions/7510396/… 我以后会记住这一点。谢谢。 啊,是的,这确实是相关的。我更新了问题。 我仍然需要上述问题的帮助。 【参考方案1】:您正在使用实体框架对吗?它与 ADO.NET 有点不同(它使用它但不是 100% 相同的东西),我们应该在问题中添加标签 EF。
这么说,你为什么要打两次db.SaveChanges
?我不会在你的 Edit 方法的顶部调用它。
另外,正如我在一些 EF 示例中看到的,您可以使用 Add
而不是 AddObject
。
检查这个:
How to: Add, Modify, and Delete Objects
最后一件事,您的对象的 StartTime 和 EndTime 属性是 TimeSpan
类型而不是日期时间?
【讨论】:
Davide:您有权自己添加 EF 标签,知道吗? 当然,但首先需要他的回答,看起来他使用 EF 但只是想听听他的意见 ;-) 我不认为是英孚。我认为它是 ADO .NET。我从默认更改为使用 LiNQ。 既然不是EF,你能帮帮我吗? 原始ADO.NET中没有dbcontext,所以我猜一定是EF!【参考方案2】:首先,我建议您不要调用db.SaveChanges
,直到您确实需要在一系列事务步骤中间保存一个实体对象..
因为 Entity Framework 支持一次性保存所有 EntityContext 对象!
我认为您可以尝试像这样更改代码,
[HttpPost]
public ActionResult Edit(DailyReport dailyReport, int weeklyReportID, int day)
if (ModelState.IsValid)
if (dailyReport == null)
dailyReport = new DailyReport();
dailyReport.StartTime = new TimeSpan(7, 0, 0);
dailyReport.EndTime = new TimeSpan(7 + 8, 0, 0);
dailyReport.Day = day;
db.DailyReports.AddObject(dailyReport);
WeeklyReport weeklyReport = (from WeeklyReport wr in db.WeeklyReports where wr.Id == weeklyReportID select wr).SingleOrDefault();
if (!weeklyReport.DailyReport.Any(dr => dr.Id == dailyReport.Id))
weeklyReport.DailyReport.Add(dailyReport);
dailyReport.WeeklyReport = weeklyReport;
db.SaveChanges();
return RedirectToAction("Edit", "WeeklyReport", new id = weeklyReportID, week = weeklyReport.Week, year = weeklyReport.Year );
我认为如果要更新实体对象,则需要调用SingleOrDefault
而不是FirstOrDefault
。我在 Linq2Sql 上这样做了..
【讨论】:
以上是关于带有 ADO .NET 的 ASP .NET MVC 会导致问题吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在带有 ADO.NET 的 ASP.NET Core MVC 中使用 jQuery Ajax 自动完成