使用EF 5更新记录而不首先加载

本文关键字:加载 新记录 EF 更新 使用 | 更新日期: 2023-09-27 18:27:40

我有一个WebApi应用程序,我正在研究一些POST/PUT方法,并试图找出使用实体框架更新数据库中记录的最佳方式。

使用WebApi的主要问题是请求将只具有完整对象的完整属性的子集。

例如,我有一个Site对象,它有一个指向相关项目的Project导航对象。由于当前站点无法移动项目,我没有为projectId提供PUT命令,这意味着SiteProject对象是空的,这在尝试更新时会导致问题(即使声明该属性未修改),因此我被迫先读取记录,然后合并更改,然后持久化,如:

对于下面的示例,site是作为参数传递到PUT路由的对象,因此在这种情况下是部分site对象

//Grab the existing site
var dbSite = (from s in _repo
                       where s.Id == id
                       select s).FirstOrDefault();
//Update unchanged values
site.Id = id;
site.CreatedOn = dbSite.CreatedOn;
var entry = _uow.Entry(dbSite);
entry.Property(e => e.Code).IsModified = true;
entry.Property(e => e.Active).IsModified = true;
entry.Property(e => e.CreatedOn).IsModified = false;
_uow.Entry(dbSite).CurrentValues.SetValues(site);
//Commit
_uow.Commit();

有没有一种方法可以在不首先加载的情况下获取部分对象(没有设置某些导航属性)并更新数据库,或者加载并更新数据库的最佳方法是我目前的方式?

使用EF 5更新记录而不首先加载

您发现,由于Site和Project之间存在逻辑关系,因此需要在实体中进行更多规范化,但这种关系并不总是必需的。

要获得所需实体的粒度,您必须将Site和Project之间的直接关系更改为多对多交叉引用表,这样您就可以在不与Project有任何联系的情况下处理Site。

网站:ID

现场项目参考号:SiteID(Site.ID)ProjectID(Project.ID)

项目:ID


当然,另一种选择是在更新之前加载网站并合并内容。但是你说你不想去那里。