如何在发布到数据库时从Web API返回标识值

时间:2016-10-21 14:20:24

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

我的数据库中有两个表,我通过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字段是数据库中的标识字段

3 个答案:

答案 0 :(得分:4)

无需添加任何新代码。

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

答案 1 :(得分:1)

您可以通过获取数据库值来执行此操作:

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

答案 2 :(得分:1)

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

您可以使用流畅的映射或属性在id上映射它。以下是流利的语法:

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

对于属性

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

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

Properties

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

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