如何使用Entity Framework更新特定记录的一个字段?

我想要更新他的名字是pejman的人的家庭。 这是我的对象类:

public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set;} public DateTime BirthDate { get; set; } public bool IsMale { get; set; } public byte[] Image { get; set; } public byte[] RowVersion { get; set; } public virtual Person Parent { get; set; } public virtual ICollection PhoneNumber { get; set; } public virtual ICollection
Addresses { get; set; } public virtual PersonInfo PersonInfo { get; set; } }

我的更新方法是:(在Program.cs中)

 public static void Update(string name, string family) { var _person = new Person() { FirstName = name, LastName = family }; using (var newContext = new MyDbContext()) { newContext.Persons.Attach(_person); newContext.Entry(_person).Property(X => X.LastName).IsModified = true; newContext.SaveChanges(); } } 

但它不起作用! 问题是什么?

编辑:假设我不知道人的身份,我只知道人的姓名,有没有办法更新人的家人?

在创建Person对象的实例时,您缺少Id字段。 由于此entity framework无法找到现有的人员。

您的代码应如下所示:

 public static void Update(int id, string name, string family) { var _person = new Person() { Id = id , FirstName = name, LastName = family }; using (var newContext = new MyDbContext()) { newContext.Persons.Attach(_person); newContext.Entry(_person).Property(X => X.LastName).IsModified = true; newContext.SaveChanges(); } 

编辑:假设我不知道人的身份,我只知道人的姓名,有没有办法更新人的家人?

我假设Person类的FirstName字段包含该人的姓名,更新该人的家庭意味着更新LastName字段。

第一步是让所有带有FirstName Person记录等于该人的名字,让我们说它是“pejman”,所以代码如下所示。

 var personsToUpdate = newContext.Persons.Where(o => o.FirstName == "pejman"); 

下一步是枚举personsToUpdate并将LastName属性设置为您想要的系列名称,然后调用.SaveChanges()方法将更改提交到数据库。 假设您要将此人的姓氏更新为“MyFamilyName”,代码如下所示

 foreach (Person p in personsToUpdate) { p.LastName = "MyFamilyName"; } newContext.SaveChanges(); 

以下是Update方法的修改代码,其中包含namefamily参数。

 public static void Update(string name, string family) { using (var newContext = new MyDbContext()) { // get all Persons with FirstName equals name var personsToUpdate = newContext.Persons.Where(o => o.FirstName == name); // update LastName for all Persons in personsToUpdate foreach (Person p in personsToUpdate) { p.LastName = family; } newContext.SaveChanges(); } } 

为了解决这个错误,我从存储在Var Temprc中的数据库中获取了ID。 然后更新了我不会更新的字段密码。 然后将temprc附加到我的Userregistrations模型。 然后Marked PasswordConfirm被修改。 然后Savechanges();

 using (var db = new Entities()) { var temprc = _reg.GetUserByID(Convert.ToInt32(Session["LogedUserID"])); temprc.PasswordConfirm = U.NewPassword; db.Userregistrations.Attach(temprc); db.Entry(temprc).Property(x => x.PasswordConfirm).IsModified = true; db.SaveChanges(); } 

假设您有数据库可以找到的Person实例(如PawełBejger所述):

 public class Person { ///  /// USAGE: await UpdateDbEntryAsync(myPerson, d => d.FirstName, d => d.LastName); ///  async Task UpdateDbEntryAsync(T entity, params Expression>[] properties) where T : class { try { var db = new RtTradeData.Models.ApplicationDbContext(); var entry = db.Entry(entity); db.Set().Attach(entity); foreach (var property in properties) entry.Property(property).IsModified = true; await db.SaveChangesAsync(); return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("UpdateDbEntryAsync exception: " + ex.Message); return false; } } ///  /// The idea is that SomeFunction already has the instance of myPerson, that it wants to update. ///  public void SomeFunction() { myPerson.FirstName = "Another Name"; myPerson.LastName = "NewLastName"; UpdateDbEntryAsync(myPerson, d => d.FirstName, d => d.LastName); } ///  /// Or directly requesting the person instance to update its own First and Last name... ///  public void Update(string firstName, string lastName) { FirstName = "Another Name"; LastName = "NewLastName"; UpdateDbEntryAsync(this, d => d.FirstName, d => d.LastName); } Person myPerson = new Person { PersonId = 5, FirstName = "Name", LastName = "Family" }; public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 

另请参阅更新Entity Framework和Entity Framework更新单个 字段

以下对我有用:

 public ActionResult ChangePassword(Account account) { try { if (ModelState.IsValid) { db.Accounts.Attach(account); db.Entry(account).Property(x => x.Password).IsModified=true; db.Configuration.ValidateOnSaveEnabled = false; db.SaveChanges(); return RedirectToAction("Index"); } } catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) { Exception raise = dbEx; foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { string message = string.Format("{0}:{1}", validationErrors.Entry.Entity.ToString(), validationError.ErrorMessage); raise = new InvalidOperationException(message, raise); } } ModelState.AddModelError("", raise); } return View(account); } 

任何对象这使得更新更容易。

 using (var db = new DBContext()) { AppUser au = new AppUser() { AppUserId = (int)txtID.Content, UserName = txtUserName.Text, Password = txtPwd.Password.ToString(), db.Entry(au).State= EntityState.Modified; db.SaveChanges(); }