2

我在将以下内容保存到数据库时遇到问题。

我有一个分支列表作为 MessageType 对象的一部分。我在第 1 部分代码中更新分支列表,然后将分支列表保存到第 2 部分中的 MessageType 对象,然后调用 db.SaveChanges()。不幸的是,新的分支列表没有保留。

// section 1
 List<Branch> myBranches = new List<Branch>();
            foreach (int bid in branches)
            {
                var bran = db.Branches.Find(bid);
                if (bran != null)
                {
                    myBranches.Add(bran);
                }
            }
//section 2
            try
            {

                messagetype.SenderID = eSenderDB.MvcApplication.SenderID;
                messagetype.Branches = myBranches;
                foreach (Branch bra in messagetype.Branches)
                {
                    db.Entry(bra).State = EntityState.Modified;
                    db.SaveChanges();

                }
                //db.Entry(messagetype.Branches).State = EntityState.Modified;
                db.Entry(messagetype).State = EntityState.Modified;

                db.SaveChanges();

我的创建方法

[HttpPost]
        public ActionResult Create(MessageType messagetype, int[] branches)
        {
            List<Branch> myBranches = new List<Branch>();
            foreach (int bid in branches)
            {
                var bran = db.Branches.Find(bid);
                if (bran != null)
                {
                    myBranches.Add(bran);
                }
            }

            {
                messagetype.Branches = myBranches;
                messagetype.SenderID = eSenderDB.MvcApplication.SenderID;
                messagetype.OptIns = 0;
                db.MessageTypes.Add(messagetype);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(messagetype);
        }
4

2 回答 2

7

您忘记将它们附加到上下文中。试试下面的代码:

foreach (Branch bra in messagetype.Branches)
{
  db.Branches.Attach(bra);
  db.Entry(bra).State = EntityState.Modified;
  db.SaveChanges();
}

在旁注中,我质疑SaveChanges在您的foreach循环中调用 to 。您可以将保存推迟到最后,它应该仍然可以正常工作。

于 2013-04-08T14:22:07.040 回答
1

我猜这两种方法是 MVC 中的 Create 和 Edit 控制器方法。

这里的问题是您的 MessageType 对象是通过 MVC Binder 直接从 HTTP 请求传入的。所以它是一个 ViewModel。同时,您将此对象用作 EntityModel。

这有点代码味道,因为表示层的需求通常会偏离数据模型的需求。为每个对象设置单独的对象会给您带来一些好处。

要解决此特定问题,您有 2 个选项:

// Tell the database context to track the object and that the initial state is modified.
db.MessageTypes.Attach(messagetype); 
db.MessageTypes(messagetype).State = EntityState.Modified;

或者,

// Separate the entity object from the view object and merge the changes.
var messageTypeEntity = db.MessageTypes.Find(messageTypeViewModel.Id);
if(messageTypeEntity == null)
{
    ModelState.AddModelError(string.Empty, "The specified MessageType could not be found.");
    return View(messageTypeViewModel);
}

// Update messageTypeEntity from messageTypeViewModel
UpdateModel(messageTypeEntity);

db.SaveChanges();

阅读有关System.Web.Mvc.Controller.UpdateModel(...)的内容,这里有一些关于 SO 的讨论。

于 2013-04-09T02:18:45.287 回答