2016-10-21 25 views
0

我在我的数据库中有两个表,我通过Web API填充时返回的标识值方法从我的控制器,我用来张贴到数据库的工作正常,我单元测试它以前。如何从网络API发布到数据库

[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字段是在数据库

+0

你使用任何存储过程来插入数据? – Aravind

+0

@Aravind,不,我正在使用上面的代码。 – ElenaDBA

+0

下面的任何代码对你有帮助吗? – Aravind

回答

2

无需添加任何新的代码。

只要您致电ctx.SaveChanges();对象ord1将在属性OrderID有新的ID。

1

标识字段可以做到这一点通过获取数据库值:

var dbObject = ctx.Entry(ord1).GetDatabaseValues(); 
return CreatedAtRoute("DefaultApi", new { id = dbObject["OrderID"] }, ord1); 
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


  • 注 - 你应该选择一个或另一个,而不是两个。
  • 我猜实体框架基于在上下文中使用的名称。
+0

如果我没有弄错,在代码优先的场景中使用'DatabaseGeneratedOption'? – ElenaDBA

+0

@ElenaDBA - 是的。你使用EDMX文件进行映射吗? – Igor

+0

@ElenaDBA - 我添加了.edmx设计器的图像,以及如何指定使用“Identity”。 – Igor