我仍然是EF和MVC 4的新手,我在处理一个相当简单的记录更新方面遇到了一些问题。 我想要做的是基本上对记录进行更改的历史记录,因此我经常需要在用新值覆盖它之前记录该记录的先前值。
我一直在遇到Unique键问题,或者根据我的编码方式,db.savechanges()会在只更新时创建一个额外的条目。
对我做错了什么的想法?
谢谢,
[HttpPost]
public ActionResult Edit(UrlRedirect urlredirect)
{
using (var db = new Context())
{
UrlRedirect old_url = db.UrlRedirects.Find(urlredirect.ID);
string notes = old_url.NewUrl;
if (ModelState.IsValid)
{
ChangeRecord cr = new ChangeRecord();
cr.Author = User.Identity.Name;
cr.Date = DateTime.Today;
cr.Change = "Modified";
cr.UrlRedirect = urlredirect;
cr.Notes = notes;
db.ChangeRecords.Add(cr);
db.Entry<UrlRedirect>(old_url).CurrentValues.SetValues(urlredirect);
db.Entry(old_url).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(urlredirect);
}
}
答案 0 :(得分:0)
您是否可以访问数据库本身?我刚创建了一个数据库表更新触发器。
我有一个表和一个具有相同模式的存档表。我使用ID和序列号在存档表上创建PK。这样做非常好,我只需要担心在主表中增加序列号。
ALTER TRIGGER [QAForum].[AnswerUpdate] ON [QAForum].[Answer] AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [QAForum].[AnswerArchive] (ID, QuestionID, AuthorID, Sequence, [Message], Rating, IsAnswer, Modified)
SELECT ID, QuestionID, AuthorID, Sequence, [Message], Rating, IsAnswer, Modified FROM deleted d;
END
当我在ActionResult中对上一个表进行更改时,我只是递增序列号,让数据库完成其余的工作。