[英]How to update one field of specific records using 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> PhoneNumber { get; set; }
public virtual ICollection<Address> 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();
}
}
但它不起作用! 问题是什么?
编辑:假设我不知道人的 ID,而我只知道人的名字,有没有办法更新人的家庭?
创建 Person 对象的实例时缺少 Id 字段。 由于此实体框架无法找到现有人员。
您的代码应如下所示:
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();
}
编辑:假设我不知道人的 ID,而我只知道人的名字,有没有办法更新人的家庭?
我假设Person
类的FirstName
字段包含此人的姓名,更新此人的家庭意味着更新LastName
字段。
第一步是获取FirstName
于此人姓名的所有Person
记录,假设它是“pejman”,因此代码如下。
var personsToUpdate = newContext.Persons.Where(o => o.FirstName == "pejman");
下一步是枚举personsToUpdate
并设置LastName
属性到你想要的姓,然后调用.SaveChanges()
的方法DbContext
提交更改到数据库。 假设您想将这个人的姓氏更新为“MyFamilyName”,代码如下
foreach (Person p in personsToUpdate)
{
p.LastName = "MyFamilyName";
}
newContext.SaveChanges();
以下是带有name
和family
参数的Update
方法的修改代码。
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 是Modified。 然后 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
{
/// <summary>
/// USAGE: await UpdateDbEntryAsync(myPerson, d => d.FirstName, d => d.LastName);
/// </summary>
async Task<bool> UpdateDbEntryAsync<T>(T entity, params Expression<Func<T, object>>[] properties) where T : class
{
try
{
var db = new RtTradeData.Models.ApplicationDbContext();
var entry = db.Entry(entity);
db.Set<T>().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;
}
}
/// <summary>
/// The idea is that SomeFunction already has the instance of myPerson, that it wants to update.
/// </summary>
public void SomeFunction()
{
myPerson.FirstName = "Another Name"; myPerson.LastName = "NewLastName";
UpdateDbEntryAsync(myPerson, d => d.FirstName, d => d.LastName);
}
/// <summary>
/// Or directly requesting the person instance to update its own First and Last name...
/// </summary>
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; }
}
以下对我有用:
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);
}
我想更新一个叫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> PhoneNumber { get; set; }
public virtual ICollection<Address> 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();
}
}
但这不起作用! 问题是什么?
编辑:假设我不知道人的身份证,而我只知道人的名字,有什么办法可以更新人的家庭吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.