【问题标题】:How to return identity value from Web API when posting to the database发布到数据库时如何从 Web API 返回身份值
【发布时间】:2016-10-22 03:35:46
【问题描述】:

我的数据库中有两个表,我正在通过 Web API 填写:

Orders
________
OrderID
OrderDate
OrderStatusID

OrderItems
___________
OrderID
ItemID
ItemNote
ItemSortOrder

以下是我的控制器中用于将订单发布到数据库的方法,它工作正常,我之前对其进行了单元测试。

[ResponseType(typeof(myClass.Order))]
[HttpPost]
public IHttpActionResult PostNewOrder(myClass.Order ord1)
{
      if (!ModelState.IsValid)
      {
          return BadRequest(ModelState);
      }
      using (MyContext ctx = new MyContext())
      {

          ctx.Orders.Add(ord1);
          ctx.SaveChanges();

          return CreatedAtRoute("DefaultApi", new { id = ord1.OrderID }, ord1);

      }
}

我的问题是 - 如何从数据库中返回新插入订单的 OrderID? OrderID 字段是数据库中的标识字段

【问题讨论】:

  • 您是否使用任何存储过程插入数据??
  • @Aravind,不,我正在使用上面的代码。
  • 以下代码对您有帮助吗?

标签: entity-framework asp.net-web-api


【解决方案1】:

无需添加任何新代码。

只要您调用ctx.SaveChanges();,对象ord1 就会在属性OrderID 中拥有新的ID。

【讨论】:

    【解决方案2】:

    您可以通过获取数据库值来做到这一点:

     var dbObject = ctx.Entry(ord1).GetDatabaseValues();
     return CreatedAtRoute("DefaultApi", new { id = dbObject["OrderID"] }, ord1);
    

    【讨论】:

      【解决方案3】:

      ord1.OrderID 将具有正确的订单 ID,但您必须确保实体框架已映射,以便它知道数据库将生成该 ID 的值。如果您这样做,则在您创建新订单(或任何添加了具有相同映射配置的 id 列的实体)时会读回 ID。

      您可以使用流畅的映射或属性将其映射到 id 上。这是fluent的语法:

      modelBuilder.Entity<Order>()
          .Property(x => x.OrderID)
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
      

      对于属性

      [DatabaseGenerated(DatabaseGenerationOption.Identity)] 
      public int OrderID { get; set; }
      

      如果您使用设计器(.EDMX 文件)进行映射,请参阅下图作为如何设置商店生成模式的示例。

      图像是从以前的 SO 答案中复制的。 https://stackoverflow.com/a/6306817/1260204


      • 注意 - 你应该选择一个或另一个,而不是两个。
      • 我根据上下文中使用的名称猜测实体框架。

      【讨论】:

      • 如果我没记错的话,DatabaseGeneratedOption是用在代码优先的场景中?
      • @ElenaDBA - 是的。您是否使用 EDMX 文件进行映射?
      • @ElenaDBA - 我添加了 .edmx 设计器的图像以及如何指定使用 Identity
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多