实体框架,WCF&更新
-
03-07-2019 - |
题
我创建了一个n层解决方案,我从WCF服务检索相关数据,在Windows窗体应用程序中更新它,然后通过WCF返回更新的数据以保存到数据库。应用程序,WCF服务和数据库都在不同的机器上。
正在检索的数据包含一个对象和子对象......
public Product Select(string catalogueNumber) {
return (from p in this.ProductEntities.Products.Include(@"Tracks")
where p.vcCatalogueNumber == catalogueNumber
select p).FirstOrDefault() ?? new Product();
}
客户端应用程序应用的更新,以及更新现有内容,还可以插入额外的“跟踪”消息。对象。
当我从客户端应用程序收到Product对象时,我可以正确地看到所有更新,但是为了正确保存所有更改,我必须跳过几个环...
public void Save(Product product) {
Product original = this.Select(product.vcCatalogueNumber);
if (original.EntityKey != null) {
this.ProductEntities.ApplyPropertyChanges(product.EntityKey.EntitySetName, product);
// There must be a better way to sort out the child objects...
foreach (Track track in product.Tracks.ToList()) {
if (track.EntityKey == null) {
original.Tracks.Add(track);
}
else {
this.ProductEntities.ApplyPropertyChanges(track.EntityKey.EntitySetName, track);
}
}
}
else {
this.ProductEntities.AddToProducts(product);
}
this.ProductEntities.SaveChanges();
}
当然,必须有一种更简单的方法吗?
注意:我花了大部分时间调查EntityBag项目,但发现它尚未更新以使用EF RTM。特别是,虽然它会成功更新现有数据,但在混合新对象时会抛出异常。
解决方案
我没有针对您的特定情况的现成答案 - 但只是一个问题:您是否已检查过ADO.NET数据服务(f.k.a。“Astoria”)?
它们建立在实体框架之上,WCF的RESTful界面,它们提供了客户端体验,而且它们似乎也有一个不错的故事,不仅可以查询,还可以更新,将记录插入数据库。 / p>
这可能是一个选择吗?
在 MSDN 上查看 David Hayden的博客,在 Channel9 上,或看到一些优秀的 MIX08和MIX 09 的会议
马克
其他提示
你应该看看Danny Simmons的EntityBag样本。
旨在简化这些问题: http://code.msdn.microsoft.com/entitybag/
正如CatZ所说,.NET 4.0中的事情会轻松得多。
我们计划提供帮助的一件事是为您创建一个T4模板,为您生成能够自我跟踪的类,以及一些额外的表面,使这些自我跟踪实体对ApplyChanges变得简单()返回服务器层时的上下文。
希望这有帮助
干杯 Alex(微软实体框架团队的PM)。
我看到这个帖子很安静,所以我允许自己做一些更新......
Weeeeee! 自我跟踪实体已抵达EF 4!
检查一下:
http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx 结果 实体框架团队对自我跟踪机制的解释。
http:// aleembawany。 COM / 2009/05/17 /新功能 - 在实体框架-40-V2 / 结果 EF 4中的新功能。
http://msdn.microsoft.com/en-us/magazine /ee321569.aspx 结果 断开实体的几种N层模式的比较。
享受!
在Entity Framewrok 4中,您可以使用方法“ApplyCurrentValues”;更新分离的实体。
在你的场景中会是这样的:
this.ProductEntities.Product.ApplyCurrentValues(product);
foreach (Track track in product.Tracks.ToList()) {
if (track.EntityKey != null)
{
//Update Entity
this.ProductEntities.Track.ApplyCurrentValues(track);
}
else
{
//New Entity
this.ProductEntities.Track.Attach(track);
}
}
我希望它会有用
Entity Framework v1.0的一个限制是更新实体。不幸的是,在第2版到来之前,我认为你运气不好。