Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架更新特定记录的一个字段?_C#_Entity Framework - Fatal编程技术网

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();
        }