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

时间:2013-08-13 14:41:46

标签: c# entity-framework entity-framework-5

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

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

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

下面示例的清晰度,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();

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

1 个答案:

答案 0 :(得分:0)

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

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

网站: ID

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

项目: ID


当然,替代方案是加载站点并在更新之前合并内容。但你表示你不想去那里。