【问题标题】:C# - MVC application How to update and delete a record from the databaseC# - MVC 应用程序如何更新和删除数据库中的记录
【发布时间】:2012-12-23 05:49:08
【问题描述】:

我需要知道如何更新和删除数据库中的记录。我知道如何添加记录,但无法更新和删除数据库中的记录。

namespace Ex.Models
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class MyEntities : DbContext
    {
        public MyEntities()
            : base("name= MyEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Friend> Friend { get; set; }
    }
}

--

控制器

// POST: /Home/Edit/5
[HttpPost]
public ActionResult Edit(int id, Friend f)
{
    try
    {
        // TODO: Add update logic here
        myEntities.Friend.Attach(f);// Doesn't work.. How to update ?
        myEntities.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

要向数据库添加记录,我使用了以下代码。成功了;

myEntities.Friend.Add(f);
myEntities.SaveChanges();
return RedirectToAction("Index");

更新

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Exp.Models.Friend>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Delete
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Delete</h2>

<h3>Are you sure you want to delete?</h3>
<fieldset>
    <legend>Friend</legend>

    <div class="display-label">Name</div>
    <div class="display-field">
        <%: Html.DisplayFor(model => model.Name) %>
    </div>


</fieldset>
<% using (Html.BeginForm()) { %>
    <p>
        <input type="submit" value="Delete" /> |
        <%: Html.ActionLink("Back to List", "Index") %>
    </p>
<% } %>

</asp:Content>

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework ef-code-first


    【解决方案1】:

    要更新,它与添加相同,但没有.Friend.Add(f)。像这样加载项目:

    var friendEntity = myEntites.Friend.SingleOrDefault(f => f.Id == id);
    friendEntity.Field1 = f.Field1;
    ...
    myEntities.SaveChanges();
    

    要删除,请使用 .Add(f).Remove 的反义词。

    【讨论】:

    • f=&gt;myEntities.SaveChanges(); 是否有错误?
    • 我没有测试这段代码,它是写意的。如果你还不知道=&gt;lambda expression 的语法。
    • Error 1 A local variable named 'f' cannot be declared in this scope because it would give a different meaning to 'f', which is already used in a 'parent or current' scope to denote something else 这就是我得到的。我对 C# 有点陌生
    • 啊,是的,换成别的吧。说 e 代表“实体”或 f1
    • 并且,我们是否必须告诉要编辑哪条记录。因为当我尝试编辑第二条或第三条记录时,它总是会更新数据库中的第一条记录。
    【解决方案2】:

    删除

    myEntities.Friend.Remove(f);
    myEntities.SaveChanges();
    

    更新

    Friend f = myEntities.Friend.FirstOrDefault(x => x.Id = MyId);
    f.Name = NewName;
    myEntities.SaveChanges();
    

    【讨论】:

    • 使用SingleOrDefault FirstOrDefault 有什么区别?
    • 我解决了更新部分。但是当我点击删除时,我被带到另一个页面,它会显示我选择删除的记录,并询问我是否要删除所述记录。在此页面中,我要删除的记录未显示,因此出现错误。知道我该如何解决这个问题吗?我已经更新了上面的代码。
    【解决方案3】:

    更新:

          if (ModelState.IsValid && f != null)
            {
                myEntities.Friend.Attach(f);
         var upd = (from c in myEntities.Friend
                           where c.Id == f.Id
                           select c).FirstOrDefault();
        upd.Data1=f.Data1;
        ...
        ....
                myEntities.ObjectStateManager.ChangeObjectState(f, EntityState.Modified);
                myEntities.SaveChanges();
            }
    

    删除:

       if (ModelState.IsValid && f != null)
            {
                var del = (from c in myEntities.Friend
                           where c.Id == f.Id
                           select c).FirstOrDefault();
    
                myEntities.Friend.DeleteObject(del);
                myEntities.SaveChanges();
            }
    

    【讨论】:

    • ObjectStateManager EntityState 是什么?
    • 我想在这里添加一些参考吗?
    • “ObjectStateManager”是在实体被添加到上下文后将状态从已添加更改为已修改。 'EntityState' 是实体对象的状态。也检查一下link
    【解决方案4】:

    只是概念证明 Controler.UpdateModel 不会正常工作。

    这里是全班 https://stackoverflow.com/a/39452785/1071165

    const string PK = "Id";
    protected Models.Entities con;
    protected System.Data.Entity.DbSet<T> model;
    
    [HttpPost]
    public virtual ActionResult AddEdit(T item)
    {
        TestUpdate(item);
    
        con.SaveChanges();
    
        return RedirectToAction("Index");
    }
    
    [HttpGet]
    public virtual ActionResult Remove(string id)
    {
        int nId = 0;
        int.TryParse(id, out nId);
        if (nId != 0)
        {
            var item = model.Find(nId);
            con.Entry(item).State = System.Data.Entity.EntityState.Deleted;
            con.SaveChanges();
        }
        return Redirect(Request.UrlReferrer.ToString());
    }
    
    private void TestUpdate(object item)
    {
        var props = item.GetType().GetProperties();
        foreach (var prop in props)
        {
            object value = prop.GetValue(item);
            if (prop.PropertyType.IsInterface && value != null)
            {
                foreach (var iItem in (System.Collections.IEnumerable)value)
                {
                    TestUpdate(iItem);
                }
            }
        }
    
        int id = (int)item.GetType().GetProperty(PK).GetValue(item);
        if (id == 0)
        {
            con.Entry(item).State = System.Data.Entity.EntityState.Added;
        }
        else
        {
            con.Entry(item).State = System.Data.Entity.EntityState.Modified;
        }
    
    }
    

    【讨论】:

      【解决方案5】:

      更新:第一种方式

              public void IsActiveItem(int id)
               {
                  var data = db.IRAS_InventoryItems.Find(id);
                  data.IsActive = false;
                  db.Entry(data).State = EntityState.Modified;           
                  db.SaveChanges();
               }
      

      更新:第二种方法

                 public void IsActiveItem(int id)
                 {
                  var data = (from a in db.IRAS_InventoryItems
                  where a.Id == id
                  select a).FirstOrDefault();
                  data.IsActive = false;
                  db.Entry(data).State = EntityState.Modified;           
                  db.SaveChanges();
                 }
      

      要删除:首先

               public void Remove(int id)
               {
                  var data = db.IRAS_InventoryItems.Find(id);
                  data.IsActive = false;
                  db.IRAS_InventoryItems.Remove(data);       
                  db.SaveChanges();
               }
      

      要删除:第二次

                    public void Remove(int id)
                    {
                        var data = (from a in db.IRAS_InventoryItems
                        where a.Id == id
                        select a).FirstOrDefault();                      
                        db.IRAS_InventoryItems.Remove(data);          
                        db.SaveChanges();
                     }
      

      【讨论】:

        【解决方案6】:

        在索引页面中(删除和编辑链接)

        <td>
                    <%: Html.ActionLink("Edit","Edit", new{StuID=@item.StudId}) %>
                </td>
                <td>
                    <%: Html.ActionLink("Delete","Delete", new{StuID=@item.StudId}) %>
                 </td>
        

        编辑(第一个编辑功能用于编辑页面,它获取特定ID的所有数据,第二个功能用于保存更改。)

         public ActionResult Edit(Int32 StuID)
            {
                var studata = stu.Studs.Where(x => x.StudId == StuID).FirstOrDefault();
                if (studata != null)
                {
                    TempData["ID"] = StuID;
                    TempData.Keep();
                    return View(studata);
                }
                return View();
            }
            [HttpPost]
            public ActionResult Edit(Stud stu1)
            {
                Int32 StuID = (int)TempData["ID"];
                var studata = stu.Studs.Where(x => x.StudId == StuID).FirstOrDefault();
                studata.StudName = stu1.StudName;
                studata.StudAddress = stu1.StudAddress;
                studata.StudEmail = stu1.StudEmail;
                stu.ObjectStateManager.ChangeObjectState(studata,);
                stu.SaveChanges();
                return RedirectToAction("Index");
            }
        

        删除

        public ActionResult Delete(int StuID)
            {
                if (StuID > 0)
                {
                    var studata = stu.Studs.Where(x => x.StudId == StuID).FirstOrDefault();
                    if (studata != null)
                    {
                        stu.DeleteObject(studata);
                        stu.SaveChanges();
                    }
                }
                return RedirectToAction("Index");
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多