2009-04-29 180 views
10

我创建了一个n层解决方案,我从WCF服务中检索相关数据,在Windows窗体应用程序中更新它,然后通过WCF返回更新后的数据以保存到数据库。应用程序,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(); 
} 

这些更新由客户端应用程序可以,以及更新现有的内容,还插入其他“音轨”对象被施加。

当我收到的产品对象返回客户端应用程序,我可以正确地看到所有更新,但为了保存所有的变化正确地我有过几个跳火圈......

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一起使用。特别是,虽然它会成功更新现有的数据异常,但在混合新对象时会抛出异常。

回答

3

对于您的特定场景,我没有现成的答案 - 但只是一个问题:您是否检出了ADO.NET Data Services(f.k.a.“Astoria”)?

它们基于Entity Framework,WCF的RESTful接口构建,它们提供了客户端体验,而且它们似乎也有一个体面的故事,不仅用于查询,还用于更新,将记录插入到数据库中。

这可能是一个选项吗?

检查出来的MSDN,在David Hayden's blog,在Channel9,或看到一些优秀的会议在MIX08 and MIX 09

马克

+0

这可能是东西,我应该看看,但至今我还没有。不幸的是,我们最近才开始在我工作的地方使用EF&WCF,而Astoria目前仅仅是要进行调查的新技术列表中的另一项目。谢谢。 – 2009-05-07 17:46:14

+0

我终于看到了这个(主要是因为我开始玩SilverLight),实际上,我认为这是我正在寻找的答案。 – 2009-08-20 11:50:25

0

实体框架v1.0的一个局限性是更新实体。不幸的是,我认为在版本2到来之前你运气不佳。

3

你或许应该看看丹尼·西蒙斯EntityBag样品。

它旨在简化这些各种各样的问题: http://code.msdn.microsoft.com/entitybag/

正如卡茨说事情会在.NET 4.0中轻松很多。

我们计划帮助的事情之一是为您创建一个T4模板,为您生成能够进行自我跟踪的类,以及一些额外的表面以使这些自我跟踪实体变得简单当他们回到服务器层时,将ApplyChanges()应用到上下文。

希望这有助于

干杯 克斯(对实体框架团队在微软PM)。

1

我看到这个线程很安静,所以我允许自己做一些更新......

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/new-features-in-entity-framework-40-v2/
在EF 的Anouncement新功能4.

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
比较的几个N层图案为断开的实体。

享受!

1

在实体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); 
} 

}

我希望这将是有益的