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

C# 使用EF 5更新记录而不首先加载它,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我有一个WebApi应用程序,我正在研究一些POST/PUT方法,我试图找出使用实体框架更新数据库中记录的最佳方法 使用WebApi的主要问题是请求将只包含完整对象的完整属性的子集 例如,我有一个站点对象,它有一个指向相关项目的项目导航对象。由于当前站点无法移动项目,我没有向projectId提供PUT命令,这意味着Site的Project对象为空,这会导致尝试更新时出现问题(即使声明该属性未修改),因此,我不得不先读取记录,然后合并更改,然后继续,如: 清晰对于下面的示例,site是作为参数传

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

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

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

清晰对于下面的示例,site是作为参数传递给PUT route的对象,因此在这种情况下是部分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();

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

您已经发现,由于站点和项目之间存在逻辑关系,您需要在实体中进行更多的规范化,但并不总是需要这种关系

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

地点: 身份证

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

项目: 身份证



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

可能的副本不确定我是否理解正确,但你可以始终使用_uow.Entity.Attach(dbSite)并将实体状态设置为“修改”。@nilesh但是他的对象被部分填充,这会导致EF验证错误。所以Attach不能单独工作。@Matten这个概念很相似(我确实读过这个问题),但这更多的是关于如何使用WebAPI,其中PUT中的序列化对象将不完整,并处理该对象的更新。另外,附件在这里对我不起作用。常规EF没有办法做到这一点,但它的设计就是为了解决这个问题。也许值得一看。我不确定我是否理解。一个站点总是需要一个项目,它在应用程序中必然是这样,我不想为此引入多对多结构。此外,我并不反对合并和加载(这就是我正在做的),我只是试图通过附加一个部分对象,然后将导航元素标记为未被修改,以使其不受影响来避免加载(如果可能的话),这是行不通的。我根本不了解该领域,但是,您给出的示例告诉我,
站点
并不总是需要一个
项目
——就像您所描述的
站点
正在编辑时一样……更容易看到是否用自然关键点替换代理关键点。假设-
站点
有一个位置,这是它的自然键<代码>项目有一个名称,这是它的自然键<代码>站点还包含
项目。名称
作为外键。但是,当按照您描述的方式编辑
站点时,用户对
项目
没有概念,甚至在编辑时也没有查看
项目
名称。因此,
站点
可以独立于
项目
而存在。嗨,Keith,站点绑定到一个项目,这就是关系。更新时我不需要它的原因是因为该站点已经分配了一个,所以我只是希望EF在更新时忽略它。我不确定增加模型的复杂性是一条可行的道路,我想我宁愿坚持加载和更新已经存在的东西。