实体框架3.5 - 如何在不首先从数据库加载行的情况下更新行

Riz*_*Riz 3 c# sql-server entity-framework

这是我当前更新数据库中字段的代码

private void SaveUser(User user)
{
   USER UserObj = _db.USERs.First(i => i.USER_ID == user.USER_ID);
   UserObj.NAME = user.NAME;
   _db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,我想改变两件事

1)我可以先跳过从DB加载行吗?即这条线USER UserObj = _db.USERs.First(i => i.USER_ID == user.USER_ID);

2)如果要更新20个字段,如何一次设置所有字段?或者我自己要写所有20个作业?

谢谢

Lad*_*nka 5

编辑 - 为EFv1修改的样本 - 它回答了您的两个问题:

您正在寻找:

private void SaveUser(User user)
{
    // Attach dummy entity - it must have only primary key property and EntityKey 
    // property assigned
    _db.USERs.Attach(new User() { ... });
    // Apply current values to dummy entity - this will mark the entity as modified
    // and it will also mark all properties (except key and store generated) as modified
    _db.ApplyPropertyChanges("UserSetName", user);
    _db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

EntityObjects(今天大部分已过时)和POCO(仅EFv4)之间存在一些差异,如果POCO标记为已修改但未更新,则POCO只会更新EntityObject.仅当属性与其原始状态不同或者属性被手动设置为已修改时,它才会更新ObjectStateEntry.

有选择地定义必须更新哪些属性与手动分配它们相同:

private void SaveUser(User user)
{
    _db.USERs.Attach(user);
    ObjectStateEntry entry = _db.ObjectStateManager.GetObjectStateEntry(user);
    entry.SetModifiedProperty("PropertyName");
    // set other properties
    _db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句.你听说过命名惯例吗?