จะอัพเดทเพียงหนึ่งฟิลด์โดยใช้ Entity Framework ได้อย่างไร


189

นี่คือตาราง

ผู้ใช้

UserId
UserName
Password
EmailAddress

และรหัส ..

public void ChangePassword(int userId, string password){
//code to update the password..
}

26
โดยPasswordคุณหมายถึงรหัสผ่านแฮชใช่มั้ย? :-)
Edward Brey

คำตอบ:


370

คำตอบของ Ladislav ได้รับการอัพเดตเพื่อใช้ DbContext (แนะนำใน EF 4.1):

public void ChangePassword(int userId, string password)
{
  var user = new User() { Id = userId, Password = password };
  using (var db = new MyEfContextName())
  {
    db.Users.Attach(user);
    db.Entry(user).Property(x => x.Password).IsModified = true;
    db.SaveChanges();
  }
}

55
ฉันสามารถทำให้โค้ดนี้ทำงานได้โดยการเพิ่ม db.Configuration.ValidateOnSaveEnabled = false; ก่อน db.SaveChanges ()?
Jake Drew

3
ซึ่ง namespace ที่จะรวมถึงการใช้งานdb.Entry(user).Property(x => x.Password).IsModified = true;และไม่db.Entry(user).Property("Password").IsModified = true;
Johan

5
วิธีการนี้จะโยน OptimisticConcurencyException เมื่อตารางมีเขตเวลาประทับ
Maksim Vi

9
ฉันคิดว่าเป็นมูลค่าการกล่าวขวัญว่าถ้าคุณกำลังใช้db.Configuration.ValidateOnSaveEnabled = false;คุณอาจต้องการตรวจสอบความถูกต้องของเขตข้อมูลที่คุณกำลังอัปเดต:if (db.Entry(user).Property(x => x.Password).GetValidationErrors().Count == 0)
Ziul

2
คุณจำเป็นต้องตั้ง ValidateOnSaveEnabled เท็จถ้าคุณจำเป็นต้องมีเขตข้อมูลในตารางของคุณว่าคุณไม่ได้ให้ในระหว่างการปรับปรุงของคุณ
Sal

54

คุณสามารถบอก EF ได้ว่าจะต้องปรับปรุงคุณสมบัติใดด้วยวิธีนี้:

public void ChangePassword(int userId, string password)
{
  var user = new User { Id = userId, Password = password };
  using (var context = new ObjectContext(ConnectionString))
  {
    var users = context.CreateObjectSet<User>();
    users.Attach(user);
    context.ObjectStateManager.GetObjectStateEntry(user)
      .SetModifiedProperty("Password");
    context.SaveChanges();
  }
}

ObjectStateManager ไม่พร้อมใช้งานสำหรับ DBContext
LoxLox

17

คุณมีสองตัวเลือกโดยทั่วไป:

  • ใช้วิธีของ EF ไปตลอดทางในกรณีนั้นคุณต้องการ
    • โหลดวัตถุตามที่userIdให้ - วัตถุทั้งหมดได้รับการโหลด
    • ปรับปรุงpasswordสนาม
    • บันทึกวัตถุกลับมาโดยใช้.SaveChanges()วิธีการของบริบท

ในกรณีนี้มันขึ้นอยู่กับวิธีการจัดการรายละเอียดของ EF ฉันเพิ่งทดสอบสิ่งนี้และในกรณีที่ฉันเปลี่ยนเพียงฟิลด์เดียวของวัตถุสิ่งที่ EF สร้างขึ้นก็เป็นสิ่งที่คุณต้องการสร้างด้วยตนเองเช่นกัน:

`UPDATE dbo.Users SET Password = @Password WHERE UserId = @UserId`

ดังนั้น EF จึงฉลาดพอที่จะคิดได้ว่าคอลัมน์ใดมีการเปลี่ยนแปลงจริง ๆ และจะสร้างคำสั่ง T-SQL เพื่อจัดการเฉพาะการอัปเดตที่จำเป็นจริง ๆ

  • คุณกำหนดโพรซีเดอร์ที่เก็บไว้ซึ่งทำสิ่งที่คุณต้องการอย่างแน่นอนในรหัส T-SQL (แค่อัปเดตPasswordคอลัมน์สำหรับสิ่งที่ให้UserIdและไม่มีอะไรอื่น - ดำเนินการโดยทั่วไปUPDATE dbo.Users SET Password = @Password WHERE UserId = @UserId) และคุณสร้างการนำเข้าฟังก์ชั่นสำหรับโพรซีเดอร์ที่เก็บในโมเดล EF ของคุณ ฟังก์ชั่นแทนการทำตามขั้นตอนที่อธิบายไว้ข้างต้น

1
@ marc-s จริงๆแล้วคุณไม่จำเป็นต้องโหลดวัตถุทั้งหมด!
Arvand

14

ใน Entity Framework Core ให้Attachส่งคืนรายการดังนั้นสิ่งที่คุณต้องการคือ:

var user = new User { Id = userId, Password = password };
db.Users.Attach(user).Property(x => x.Password).IsModified = true;
db.SaveChanges();

12

ฉันกำลังใช้สิ่งนี้:

นิติบุคคล:

public class Thing 
{
    [Key]
    public int Id { get; set; }
    public string Info { get; set; }
    public string OtherStuff { get; set; }
}

dbcontext:

public class MyDataContext : DbContext
{
    public DbSet<Thing > Things { get; set; }
}

รหัส accessor:

MyDataContext ctx = new MyDataContext();

// FIRST create a blank object
Thing thing = ctx.Things.Create();

// SECOND set the ID
thing.Id = id;

// THIRD attach the thing (id is not marked as modified)
db.Things.Attach(thing); 

// FOURTH set the fields you want updated.
thing.OtherStuff = "only want this field updated.";

// FIFTH save that thing
db.SaveChanges();

1
ฉันได้รับข้อผิดพลาดในการตรวจสอบความถูกต้องของเอนทิตีเมื่อฉันลองทำสิ่งนี้ แต่มันก็ดูดี
devlord

ไม่ได้ใช้วิธีนี้ !!!: บางทีคุณอาจต้องให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ !!! - นี่เป็นข้อผิดพลาด: "การแนบเอนทิตีของประเภท 'Domain.Job' ล้มเหลวเนื่องจากเอนทิตีประเภทเดียวกันมีค่าคีย์หลักเหมือนกันซึ่งสามารถเกิดขึ้นได้เมื่อใช้วิธี 'แนบ' หรือการตั้งค่าสถานะของเอนทิตี เป็น 'ไม่เปลี่ยนแปลง' หรือ 'แก้ไข' หากเอนทิตีใด ๆ ในกราฟมีค่าคีย์ที่ขัดแย้งกันซึ่งอาจเป็นเพราะเอนทิตีบางส่วนเป็นสิ่งใหม่และยังไม่ได้รับค่าคีย์ที่สร้างจากฐานข้อมูล "
Lucian Bumb

Perfec! ตรวจสอบคำตอบของฉันเพื่อดูวิธีการที่ยืดหยุ่นสำหรับรุ่นใด ๆ !
kryp

10

ในขณะที่ค้นหาวิธีแก้ปัญหานี้ฉันพบความหลากหลายของคำตอบของ GONeale ผ่านบล็อกของ Patrick Desjardins :

public int Update(T entity, Expression<Func<T, object>>[] properties)
{
  DatabaseContext.Entry(entity).State = EntityState.Unchanged;
  foreach (var property in properties)
  {
    var propertyName = ExpressionHelper.GetExpressionText(property);
    DatabaseContext.Entry(entity).Property(propertyName).IsModified = true;
  }
  return DatabaseContext.SaveChangesWithoutValidation();
}

" อย่างที่คุณเห็นมันใช้พารามิเตอร์ที่สองเป็นการแสดงออกของฟังก์ชั่นซึ่งจะช่วยให้ใช้วิธีนี้ได้โดยการระบุนิพจน์แลมบ์ดาซึ่งคุณสมบัติในการอัปเดต "

...Update(Model, d=>d.Name);
//or
...Update(Model, d=>d.Name, d=>d.SecondProperty, d=>d.AndSoOn);

(มีวิธีแก้ปัญหาที่ค่อนข้างคล้ายกันที่นี่: https://stackoverflow.com/a/5749469/2115384 )

วิธีการที่ผมใช้ในรหัสของตัวเอง , การขยายไปยังจัดการ (Linq) ExpressionType.Convertนิพจน์ประเภท นี่เป็นสิ่งจำเป็นในกรณีของฉันเช่นกับGuidและคุณสมบัติวัตถุอื่น ๆ เหล่านั้นถูก 'ห่อ' ในแปลง () System.Web.Mvc.ExpressionHelper.GetExpressionTextและดังนั้นจึงไม่จัดการโดย

public int Update(T entity, Expression<Func<T, object>>[] properties)
{
    DbEntityEntry<T> entry = dataContext.Entry(entity);
    entry.State = EntityState.Unchanged;
    foreach (var property in properties)
    {
        string propertyName = "";
        Expression bodyExpression = property.Body;
        if (bodyExpression.NodeType == ExpressionType.Convert && bodyExpression is UnaryExpression)
        {
            Expression operand = ((UnaryExpression)property.Body).Operand;
            propertyName = ((MemberExpression)operand).Member.Name;
        }
        else
        {
            propertyName = System.Web.Mvc.ExpressionHelper.GetExpressionText(property);
        }
        entry.Property(propertyName).IsModified = true;
    }

    dataContext.Configuration.ValidateOnSaveEnabled = false;
    return dataContext.SaveChanges();
}

1
เมื่อฉันใช้สิ่งนี้มันทำให้ฉันมีข้อผิดพลาดดังต่อไปนี้ไม่สามารถแปลงนิพจน์แลมบ์ดาให้พิมพ์ 'Expression <Func <RequestDetail, object >> []' เนื่องจากไม่ใช่ประเภทตัวแทน
Imran Rizvi

@ImranRizvi คุณเพียงแค่ต้องอัปเดตพารามิเตอร์เป็น: public int Update (T entity, params Expression <Func <T, object >> คุณสมบัติ] []) หมายเหตุคีย์เวิร์ด params ก่อนนิพจน์
dalcam

6

ฉันมาช้าไปที่เกม แต่นี่เป็นวิธีที่ฉันทำฉันใช้เวลาสักครู่เพื่อค้นหาวิธีการแก้ปัญหาที่ฉันพอใจ สิ่งนี้ก่อให้เกิดUPDATEคำสั่งเฉพาะสำหรับเขตข้อมูลที่มีการเปลี่ยนแปลงตามที่คุณกำหนดสิ่งที่พวกเขาจะผ่านแนวคิด "รายการสีขาว" ซึ่งมีความปลอดภัยมากขึ้นเพื่อป้องกันการฉีดแบบฟอร์มบนเว็บ

ข้อความที่ตัดตอนมาจากที่เก็บข้อมูล ISession ของฉัน:

public bool Update<T>(T item, params string[] changedPropertyNames) where T 
  : class, new()
{
    _context.Set<T>().Attach(item);
    foreach (var propertyName in changedPropertyNames)
    {
        // If we can't find the property, this line wil throw an exception, 
        //which is good as we want to know about it
        _context.Entry(item).Property(propertyName).IsModified = true;
    }
    return true;
}

สิ่งนี้สามารถห่อด้วยการลอง .. จับถ้าคุณต้องการ แต่ฉันส่วนตัวชอบโทรของฉันที่จะรู้เกี่ยวกับข้อยกเว้นในสถานการณ์นี้

มันจะถูกเรียกในลักษณะเช่นนี้ (สำหรับฉันนี่คือผ่าน ASP.NET Web API):

if (!session.Update(franchiseViewModel.Franchise, new[]
    {
      "Name",
      "StartDate"
  }))
  throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));

2
ดังนั้นทางออกที่ดีกว่าของคุณคืออะไรเอลิซ่า? คุณควรระบุคุณสมบัติที่คุณอนุญาตให้มีการปรับปรุงอย่างชัดเจน (เช่นเดียวกับรายการสีขาวที่จำเป็นสำหรับUpdateModelคำสั่งของ ASP.NET MVC ) วิธีการที่คุณมั่นใจได้ว่าการฉีดฟอร์มแฮ็กเกอร์ไม่สามารถเกิดขึ้นได้และพวกเขาไม่สามารถอัปเดตฟิลด์ต่างๆ หากใครบางคนสามารถแปลงอาร์เรย์สตริงเป็นพารามิเตอร์ของแลมบ์ดานิพจน์และทำงานกับมันได้ในสิ่งUpdate<T>ที่ยอดเยี่ยม
GONeale

3
@GONeale - เพิ่งผ่านไป ใครบางคนแตกมันโดยใช้แลมบ์ดา!
David Spence

1
@Elisa สามารถปรับปรุงได้โดยใช้ Func <T, List <object>> แทนที่จะเป็นสตริง []
Spongebob Comrade

แม้ในภายหลังกับเกมและบางทีนี่อาจเป็นไวยากรณ์ที่ใหม่กว่า แต่var entity=_context.Set<T>().Attach(item);ตามด้วยentity.Property(propertyName).IsModified = true;ในลูปควรใช้งานได้
Auspex

4

Entity Framework ติดตามการเปลี่ยนแปลงของคุณกับวัตถุที่คุณสอบถามจากฐานข้อมูลผ่าน DbContext ตัวอย่างเช่นถ้าคุณ DbContext ชื่ออินสแตนซ์คือ dbContext

public void ChangePassword(int userId, string password){
     var user = dbContext.Users.FirstOrDefault(u=>u.UserId == userId);
     user.password = password;
     dbContext.SaveChanges();
}

และมุมมองควรเป็นอย่างไรในกรณีนี้
Emanuela Colta

สิ่งนี้ผิดเพราะมันจะบันทึกวัตถุผู้ใช้ทั้งหมดด้วยรหัสผ่านที่เปลี่ยนไป
amuliar

นั่นเป็นความจริง แต่ส่วนที่เหลือของวัตถุผู้ใช้จะเหมือนกันกับที่ก่อนหน้านี้ในบริบทสิ่งเดียวที่อาจแตกต่างกันก็คือรหัสผ่าน
Tomislav3008

3

ฉันรู้ว่านี่เป็นเธรดเก่า แต่ฉันก็กำลังมองหาโซลูชันที่คล้ายกันและตัดสินใจใช้โซลูชัน @ Doku ที่ให้มาด้วย ฉันแสดงความคิดเห็นเพื่อตอบคำถามที่ถามโดย @Imran Rizvi ฉันติดตาม @ Doku-so ลิงก์ที่แสดงการใช้งานที่คล้ายกัน คำถามของ @Imran Rizvi คือเขาได้รับข้อผิดพลาดโดยใช้โซลูชันที่ให้ไว้ 'ไม่สามารถแปลงนิพจน์แลมบ์ดาเป็นประเภท' Expression> [] 'เนื่องจากไม่ใช่ประเภทตัวแทน ฉันต้องการนำเสนอการแก้ไขเล็กน้อยที่ฉันทำกับโซลูชันของ @ Doku-so ที่แก้ไขข้อผิดพลาดนี้ในกรณีที่มีผู้อื่นมาโพสต์นี้และตัดสินใจที่จะใช้โซลูชันของ @ Doku-so

ปัญหาคืออาร์กิวเมนต์ที่สองในวิธีการอัพเดต

public int Update(T entity, Expression<Func<T, object>>[] properties). 

เพื่อเรียกวิธีนี้โดยใช้ไวยากรณ์ที่ให้ไว้ ...

Update(Model, d=>d.Name, d=>d.SecondProperty, d=>d.AndSoOn); 

คุณต้องเพิ่มคำหลัก 'params' ต่อหน้า arugment ที่สองด้วย

public int Update(T entity, params Expression<Func<T, object>>[] properties)

หรือถ้าคุณไม่ต้องการเปลี่ยนลายเซ็นของเมธอดจากนั้นจะเรียกเมธอด Update ที่คุณต้องเพิ่มคีย์เวิร์ด ' ใหม่ ' ระบุขนาดของอาเรย์จากนั้นใช้สุดท้ายคอลเลกชันวัตถุเริ่มต้นของไวยากรณ์สำหรับแต่ละคุณสมบัติเพื่ออัพเดตตามที่เห็น ด้านล่าง

Update(Model, new Expression<Func<T, object>>[3] { d=>d.Name }, { d=>d.SecondProperty }, { d=>d.AndSoOn });

ในตัวอย่างของ @ Doku-so เขากำลังระบุอาร์เรย์ของนิพจน์ดังนั้นคุณต้องผ่านคุณสมบัติเพื่ออัปเดตในอาร์เรย์เนื่องจากอาร์เรย์คุณต้องระบุขนาดของอาร์เรย์ด้วย เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถเปลี่ยนอาร์กิวเมนต์ expression เพื่อใช้ IEnumerable แทน array

นี่คือการใช้งานโซลูชันของ @ Doku-so ของฉัน

public int Update<TEntity>(LcmsEntities dataContext, DbEntityEntry<TEntity> entityEntry, params Expression<Func<TEntity, object>>[] properties)
     where TEntity: class
    {
        entityEntry.State = System.Data.Entity.EntityState.Unchanged;

        properties.ToList()
            .ForEach((property) =>
            {
                var propertyName = string.Empty;
                var bodyExpression = property.Body;
                if (bodyExpression.NodeType == ExpressionType.Convert
                    && bodyExpression is UnaryExpression)
                {
                    Expression operand = ((UnaryExpression)property.Body).Operand;
                    propertyName = ((MemberExpression)operand).Member.Name;
                }
                else
                {
                    propertyName = System.Web.Mvc.ExpressionHelper.GetExpressionText(property);
                }

                entityEntry.Property(propertyName).IsModified = true;
            });

        dataContext.Configuration.ValidateOnSaveEnabled = false;

        return dataContext.SaveChanges();
    }

การใช้งาน:

this.Update<Contact>(context, context.Entry(modifiedContact), c => c.Active, c => c.ContactTypeId);

@ Doku- ให้วิธีการที่ยอดเยี่ยมในการใช้งานทั่วไปฉันใช้แนวคิดในการแก้ปัญหาของฉัน แต่คุณไม่สามารถใช้โซลูชันของ @ Doku-so ตามที่เป็นอยู่และในทั้งโพสต์นี้และโพสต์ที่เชื่อมโยงไม่มีใครตอบคำถามข้อผิดพลาดการใช้งาน


ฉันกำลังทำงานกับโซลูชันของคุณเมื่อโปรแกรมส่งentityEntry.State = EntityState.Unchanged;ค่าที่อัปเดตทั้งหมดในพารามิเตอร์entityEntryรับการย้อนกลับดังนั้นจึงไม่มีการบันทึกการเปลี่ยนแปลงคุณช่วยได้โปรดขอบคุณ
sairfan

3

ใน EntityFramework Core 2.x ไม่จำเป็นต้องมีAttach:

 // get a tracked entity
 var entity = context.User.Find(userId);
 entity.someProp = someValue;
 // other property changes might come here
 context.SaveChanges();

พยายามทำสิ่งนี้ใน SQL Server และทำโปรไฟล์:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [User] SET [someProp] = @p0
WHERE [UserId] = @p1;
SELECT @@ROWCOUNT;

',N'@p1 int,@p0 bit',@p1=1223424,@p0=1

ค้นหาทำให้แน่ใจว่าเอนทิตีที่โหลดแล้วไม่ได้เรียกใช้ SELECT และยังแนบเอนทิตีโดยอัตโนมัติหากจำเป็น (จากเอกสาร):

    ///     Finds an entity with the given primary key values. If an entity with the given primary key values
    ///     is being tracked by the context, then it is returned immediately without making a request to the
    ///     database. Otherwise, a query is made to the database for an entity with the given primary key values
    ///     and this entity, if found, is attached to the context and returned. If no entity is found, then
    ///     null is returned.

1

การรวมคำแนะนำหลายข้อฉันขอเสนอดังต่อไปนี้

    async Task<bool> UpdateDbEntryAsync<T>(T entity, params Expression<Func<T, object>>[] properties) where T : class
    {
        try
        {
            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;
        } 
    }

เรียกโดย

UpdateDbEntryAsync(dbc, d => d.Property1);//, d => d.Property2, d => d.Property3, etc. etc.);

หรือโดย

await UpdateDbEntryAsync(dbc, d => d.Property1);

หรือโดย

bool b = UpdateDbEntryAsync(dbc, d => d.Property1).Result;

วิธีการทำให้วิธีนี้ใช้ได้สำหรับชั้นเรียนอื่น ๆ อาจจะเป็นวิธีการขยาย?
Velkumar

ในการกวดวิชา. NET CORE นี้พวกเขาแสดงวิธีปฏิบัติที่ดีที่สุดโดยใช้ (ใหม่) EF Core เพื่อปรับปรุงคุณสมบัติเฉพาะใน MVC มองหา 'TryUpdateModelAsync'
Guy

1
@ ซื้อสุดยอด แม้ว่าอีกครั้ง "แนวปฏิบัติที่ดีที่สุด" ของ Microsoft คือการทำสิ่งอื่นนอกเหนือจากที่เครื่องมือของพวกเขาสร้างขึ้น ...
Auspex

นี่เป็นทางออกที่ดี
ทิโมธี Macharia

1

ฉันใช้ ValueInjecter nuget เพื่อฉีด Binding Model ลงใน Entity ของฐานข้อมูลโดยใช้สิ่งต่อไปนี้

public async Task<IHttpActionResult> Add(CustomBindingModel model)
{
   var entity= await db.MyEntities.FindAsync(model.Id);
   if (entity== null) return NotFound();

   entity.InjectFrom<NoNullsInjection>(model);

   await db.SaveChangesAsync();
   return Ok();
}

สังเกตการใช้งานของการประชุมที่กำหนดเองที่ไม่ได้ปรับปรุงคุณสมบัติถ้าพวกเขาเป็นโมฆะจากเซิร์ฟเวอร์

ValueInjecter v3 +

public class NoNullsInjection : LoopInjection
{
    protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp)
    {
        if (sp.GetValue(source) == null) return;
        base.SetValue(source, target, sp, tp);
    }
}

การใช้งาน:

target.InjectFrom<NoNullsInjection>(source);

Value Injecter V2

ค้นหา คำตอบนี้

ข้อแม้

คุณจะไม่ทราบว่าทรัพย์สินถูกลบโดยเจตนาหรือไม่และไม่มีค่าใด ๆ กล่าวอีกนัยหนึ่งค่าคุณสมบัติสามารถถูกแทนที่ด้วยค่าอื่น แต่ไม่ได้เคลียร์


0

ฉันกำลังมองหาที่เดียวกันและในที่สุดก็พบทางออก

using (CString conn = new CString())
{
    USER user = conn.USERs.Find(CMN.CurrentUser.ID);
    user.PASSWORD = txtPass.Text;
    conn.SaveChanges();
}

เชื่อฉันมันทำงานให้ฉันเหมือนมีเสน่ห์


0

นี่คือสิ่งที่ฉันใช้โดยใช้ InjectNonNull แบบกำหนดเอง (obj dest, obj src) ทำให้มีความยืดหยุ่นอย่างเต็มที่

[HttpPost]
public async Task<IActionResult> Post( [FromQuery]Models.Currency currency ) {
  if ( ModelState.IsValid ) {
    // find existing object by Key
    Models.Currency currencyDest = context.Currencies.Find( currency.Id ); 

    context.Currencies.Attach( currencyDest );

    // update only not null fields
    InjectNonNull( currencyDest, currency );

    // save
    await context.SaveChangesAsync( );
  }  
  return Ok();
}

// Custom method
public static T InjectNonNull<T>( T dest, T src ) {
  foreach ( var propertyPair in PropertyLister<T, T>.PropertyMap ) {
    var fromValue = propertyPair.Item2.GetValue( src, null );
    if ( fromValue != null && propertyPair.Item1.CanWrite ) {
       propertyPair.Item1.SetValue( dest, fromValue, null );
    }
  }
  return dest;
}

-1
public async Task<bool> UpdateDbEntryAsync(TEntity entity, params Expression<Func<TEntity, object>>[] properties)
{
    try
    {
        this.Context.Set<TEntity>().Attach(entity);
        EntityEntry<TEntity> entry = this.Context.Entry(entity);
        entry.State = EntityState.Modified;
        foreach (var property in properties)
            entry.Property(property).IsModified = true;
        await this.Context.SaveChangesAsync();
        return true;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

-7
public void ChangePassword(int userId, string password)
{
  var user = new User{ Id = userId, Password = password };
  using (var db = new DbContextName())
  {
    db.Entry(user).State = EntityState.Added;
    db.SaveChanges();
  }
}

1
นี่จะเพิ่มแถวใหม่ คำถามคือวิธีการอัปเดตที่มีอยู่
Edward Brey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.