2

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

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

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

下面的例子很清楚,站点是作为参数传递给 PUT 路由的对象,所以在这种情况下是部分站点对象

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

有没有办法获取部分对象(没有设置某些导航属性)并更新数据库而不先加载它,或者是加载它并更新我目前正在做的方式的最佳方法?

4

1 回答 1

0

您发现您需要在实体中进行更多规范化,因为您在 Site 和 Project 之间具有逻辑关系,但并不总是需要这种关系。

要获得所需实体的粒度,您必须将站点和项目之间的直接关系更改为多对多交叉引用表,以便您可以在与项目没有任何关系的站点上工作。

站点:ID

SiteProjectRef:SiteID (Site.ID) ProjectID (Project.ID)

项目:身份证


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

于 2013-08-13T15:05:10.990 回答