C# 如何使用实体框架更新特定记录的一个字段?
我想知道一个叫佩曼的人的家庭情况。 这是我的对象类:C# 如何使用实体框架更新特定记录的一个字段?,c#,entity-framework,C#,Entity Framework,我想知道一个叫佩曼的人的家庭情况。 这是我的对象类: 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; } pu
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; }
}
但它不起作用!有什么问题
编辑:假设我不知道此人的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
字段
第一步是获取所有Person
记录,其中FirstName
等于此人的姓名,假设它是“pejman”,因此代码如下所示
var personsToUpdate = newContext.Persons.Where(o => o.FirstName == "pejman");
下一步是枚举personsToUpdate
并将LastName
属性设置为所需的姓氏,然后调用DbContext
的.SaveChanges()
方法将更改提交到数据库。假设您想将此人的姓氏更新为“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();
}
}
以下几点对我很有用:
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);
}
为了解决这个错误,我从存储在Var Temprc中的数据库中获取了ID值。 然后更新了我不想更新的字段密码。 然后将temprc附加到我的用户注册模型。 然后修改了标记为PasswordConfirm的密码。 然后保存更改()
假设您有db可以找到的人的实例(如PawełBejger所述):
公共类人物
{
///
///用法:wait UpdateDbEntryAsync(myPerson,d=>d.FirstName,d=>d.LastName);
///
异步任务UpdateDbEntryAsync(T实体,参数表达式[]属性),其中T:class
{
尝试
{
var db=new RtTradeData.Models.ApplicationDbContext();
var分录=数据库分录(实体);
db.Set().Attach(实体);
foreach(属性中的var属性)
entry.Property(Property).IsModified=true;
等待db.saveChangesSync();
返回true;
}
捕获(例外情况除外)
{
System.Diagnostics.Debug.WriteLine(“UpdateDbEntryAsync异常:”+ex.Message);
返回false;
}
}
///
///其想法是,某些函数已经有了myPerson的实例,它希望更新该实例。
///
公共函数()
{
myPerson.FirstName=“其他名称”myPerson.LastName=“NewLastName”;
UpdateDbEntryAsync(myPerson,d=>d.FirstName,d=>d.LastName);
}
///
///或者直接请求person实例更新其自己的名字和姓氏。。。
///
公共void更新(字符串firstName、字符串lastName)
{
FirstName=“其他名称”LastName=“NewLastName”;
UpdateDbEntryAsync(this,d=>d.FirstName,d=>d.LastName);
}
Person myPerson=newperson{PersonId=5,FirstName=“Name”,LastName=“Family”};
公共int PersonId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
也看到
和任何对象,这使得更新更容易
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();
}
谢谢但假设我不知道那个人的身份证,我只知道那个人的名字!有没有办法用名字更新我的记录?为什么你不知道我的身份证?如果你这样做会容易得多。如果有多个人同名怎么办?这只是一个测试程序。。也许在某些项目中,我想使用postalCode列更新一些记录!我想要一种根据唯一列进行更新的方法,不仅是键列Sure,而且在开始更新之前,您应该已经拥有实体(您以前从数据库检索到的人的实例,数据库可以通过其键找到该实体)。太好了,一段代码,没有解释为什么它会工作,或者它是如何解决问题的。你从另一篇文章中得到了这个答案。我记得这篇文章。你很难理解&你的答案有错误
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();
}
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; }
}
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();
}