如果我在AddObject上添加数据,如何返回ID?

时间:2013-04-09 15:41:38

标签: wcf entity-framework wcf-data-services odata

我正在使用WCF数据服务客户端并尝试将对象添加到我的datacontext(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方法,但此approch也返回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
        }
    }

2 个答案:

答案 0 :(得分:4)

如果您可以使用OData V3,则可以将DataServiceContext.AddAndUpdateResponsePreference设置为IncludeContent。这会向服务器发送一个prefer头,服务器将在POST请求的响应中包含该实体。客户端然后解析它并将值应用于客户端对象。这样,一旦SaveChanges完成,新生成的ID应该在客户端OM中可见。

答案 1 :(得分: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;
    }