我的数据库中有两个表,我通过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字段是数据库中的标识字段
答案 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
文件)进行映射,请参阅下面的图像,作为如何设置商店生成模式的示例。
图像是从之前的SO答案中复制的。 https://stackoverflow.com/a/6306817/1260204