我有一个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();
有没有办法获取部分对象(没有设置某些导航属性)并更新数据库而不先加载它,或者是加载它并更新我目前正在进行的方式的最佳方法?
答案 0 :(得分:0)
您发现在实体中需要更多规范化,因为您在Site和Project之间存在逻辑关系,但并不总是需要这种关系。
要获得所需实体的粒度,您必须将Site和Project之间的直接关系更改为多对多交叉引用表,以便您可以在没有任何项目关系的情况下在站点上工作
网站: ID
SiteProjectRef: SiteID(Site.ID) ProjectID(Project.ID)
项目: ID
当然,替代方案是加载站点并在更新之前合并内容。但你表示你不想去那里。