我创建了一个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版到来之前,我认为你运气不好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top