10

我创建了一个 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 一起使用。特别是,虽然它会成功更新现有数据,但在混合新对象时会引发异常。

4

5 回答 5

3

对于您的特定场景,我没有现成的答案 - 但只是一个问题:您检查过 ADO.NET 数据服务(fka“Astoria”)吗?

它们构建在 Entity Framework、WCF 的 RESTful 接口之上,它们提供了客户端体验,此外,它们似乎还有一个不错的故事,不仅可以查询,还可以更新、将记录插入数据库。

这可能是一种选择吗?

MSDNDavid Hayden 的博客Channel9上查看它们,或者在MIX08 和 MIX 09上查看一些出色的会议

马克

于 2009-05-02T13:57:02.277 回答
3

您可能应该看看 Danny Simmons 的 EntityBag 示例。

它旨在简化这类问题: http ://code.msdn.microsoft.com/entitybag/

正如 CatZ 所说,在 .NET 4.0 中事情会容易得多。

我们计划帮助您做的一件事是为您创建一个 T4 模板,该模板为您生成能够自我跟踪的类,以及一些额外的表面,以使这些自我跟踪实体可以轻松地 ApplyChanges()当他们回到服务器层时的上下文。

希望这可以帮助

干杯 Alex(Microsoft 实体框架团队的 PM)。

于 2009-05-03T05:58:38.813 回答
1

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

呜呜呜!自我跟踪实体已在 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 4 中的新功能。

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
断开实体的几种 N 层模式的比较。

享受 !

于 2009-10-27T15:15:41.360 回答
1

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

}

我希望它会有用

于 2011-03-09T09:49:53.603 回答
0

Entity Framework v1.0 的限制之一是更新实体。不幸的是,我认为在第 2 版到来之前你很不走运。

于 2009-04-29T20:06:30.243 回答