2

我正在使用 WCF 数据服务客户端并尝试将对象添加到我的数据上下文 (EntityFramework)。对象已添加,但之后我无法使用该 ID。有没有可能触发SaveChanges方法后,对象直接获取到自动生成的id?

Order order=new Order();
order.name="test";
context.AddObject("Order", order);
if (await context.SaveChanges()) //Extension method on my context to save changes async
{
  System.Diagnostics.Debug.WriteLine(order.id); //output: 0
}

我的扩展方法如下所示:

public partial class MyEntities
{
  public async Task<bool> SaveChanges()
  {
    var queryTask = Task.Factory.FromAsync(this.BeginSaveChanges(null,null), asResult =>
    {
        return(asResult.IsCompleted);
    });
    return await queryTask;
  }
}

我也尝试扩展该AddObject方法,但此方法也返回 0 值:

    internal async void AddObject<TResult>(object entity) where TResult : IExtend
    {
        base.AddObject(entity.ToString().Split('.').Last(), entity);
        if (await this.SaveChanges())
        {
            System.Diagnostics.Debug.WriteLine(((TResult)entity).id); //output: 0
        }
    }
4

2 回答 2

4

如果您可以使用 OData V3,那么您可以DataServiceContext.AddAndUpdateResponsePreferenceIncludeContent. 这会向服务器发送一个首选标头,并且服务器将在对 POST 请求的响应中包含该实体。客户端然后解析它并将值应用于客户端对象。完成后,新生成的 ID 应该在客户端 OM 中可见SaveChanges

于 2013-04-09T19:05:44.243 回答
0

我错过了这个EndSaveChanges功能。当我将扩展功能更改为此时,对象 ID 会更新。

    public async Task<DataServiceResponse> SaveChanges()
    {
        var queryTask = Task.Factory.FromAsync(this.BeginSaveChanges(null,null), asResult =>
        {
            var result = this.EndSaveChanges(asResult);
            return result;
        });
        return await queryTask;
    }
于 2013-04-10T08:15:27.713 回答