尝试添加项目时 Entity Framework 出错
Getting error in Entity Framework when trying to add an item
我在尝试将项目添加到数据库上下文时遇到以下错误。我在 Web API 项目中使用 Entity Framework。示例代码如下所示。
异常
System.Data.Entity.Infrastructure.DbUpdateException
HResult=0x80131501 Message=An error occurred while updating the
entries. See the inner exception for details. Source=EntityFramework
StackTrace: at
System.Data.Entity.Internal.InternalContext.SaveChanges() at
System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at
System.Data.Entity.DbContext.SaveChanges() at
WebApiSample.Controllers.OrdersController.Orders(Order neworder) in
C:\Repository\bitbucket\OtherProjects\WebApiSample\WebApiSample\Controllers\OrdersController.cs:line
173 at
System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.b__9(Object
instance, Object[] methodParameters) at
System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object
instance, Object[] arguments) at
System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext
controllerContext, IDictionary`2 arguments, CancellationToken
cancellationToken)
Inner Exception 1: UpdateException: An error occurred while updating
the entries. See the inner exception for details.
Inner Exception 2: SqlException: Cannot insert the value NULL into
column 'OrderNumber', table
'C:\REPOSITORY\BITBUCKET\OTHERPROJECTS\WEBAPISAMPLE\WEBAPISAMPLE\APP_DATA\DATA.MDF.dbo.Orders';
column does not allow nulls. INSERT fails. The statement has been
terminated.
这段代码是在WebPOST方法中编写的API:
[HttpPost]
public IHttpActionResult Orders(Order neworder)
{
if (neworder == null)
{
return BadRequest();
}
string uri = Url.Link("DefaultApi", new { id = neworder.OrderNumber });
try
{
using (OrderContext db = new OrderContext("ConnectionString"))
{
if (neworder == null)
{
return BadRequest();
}
db.Orders.Add(neworder);
db.SaveChanges();
}
}
catch (Exception ex)
{
throw ex;
}
return Created<Order>(uri, neworder);
}
Order
实体:
namespace WebApiSample.Models
{
public class Order
{
[Key]
public int OrderNumber { get; set; }
public Decimal OrderAmount { get; set; }
public DateTime OrderDate { get; set; }
public string CustomerName { get; set; }
public int OrderQty { get; set; }
[Column("ShippingStatusFlag")]
public string ShippingStatus { get; set; }
public virtual ICollection<OrderItems> Items { get; set; }
}
}
OrderItems
实体:
namespace WebApiSample.Models
{
[Table("OrderItems")]
public class OrderItems
{
[Key]
[ForeignKey("Order")]
[Column(Order =1)]
public int OrderNumber { get; set; }
[Key]
[Column(Order = 2)]
public int ItemID { get; set; }
[Key]
[Column(Order = 3)]
public int ItemSeq { get; set; }
public Decimal ItemPrice { get; set; }
public string ItemDescription { get; set; }
public int ItemQty { get; set; }
public virtual Order Order { get; set; }
}
}
在POST请求体中传递的数据是
{
"OrderNumber": 9000,
"OrderAmount": 20,
"OrderDate": "2018-01-15T00:00:00",
"CustomerName": "TEST",
"OrderQty": 3,
"ShippingStatus": "N",
"Items": [
{
"OrderNumber": 9000,
"ItemID": 535,
"ItemSeq": 1,
"ItemPrice": 10,
"ItemDescription": "Plantronics Bluetooth Headset",
"ItemQty": 1,
"order": null
},
{
"OrderNumber": 9000,
"ItemID": 536,
"ItemSeq": 2,
"ItemPrice": 5,
"ItemDescription": "Yellow StickyNote 100ct",
"ItemQty": 1,
"order": null
},
{
"OrderNumber": 9000,
"ItemID": 601,
"ItemSeq": 3,
"ItemPrice": 5,
"ItemDescription": "Black Think Permanent Marker",
"ItemQty": 1,
"order": null
}
]
}
是什么导致了这个问题?我在这里做错了什么?
将您的 OrderNumber
属性 修改为 DatabaseGeneratedAttribute
public class Order
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int OrderNumber { get; set; }
...
}
背景:当单个整数属性标记为Key
时,默认设置为DatabaseGeneratedOption.Identity
。使用此设置,EF 假定数据库将负责分配新的主键值。所以对于状态为 Added
的实体,key 列将被忽略,不会被传输到数据库中。
这解释了为什么错误是关于 属性 的 NULL
值的,在代码中甚至不能为空。
我在尝试将项目添加到数据库上下文时遇到以下错误。我在 Web API 项目中使用 Entity Framework。示例代码如下所示。
异常
System.Data.Entity.Infrastructure.DbUpdateException
HResult=0x80131501 Message=An error occurred while updating the entries. See the inner exception for details. Source=EntityFramework StackTrace: at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at System.Data.Entity.DbContext.SaveChanges() at WebApiSample.Controllers.OrdersController.Orders(Order neworder) in C:\Repository\bitbucket\OtherProjects\WebApiSample\WebApiSample\Controllers\OrdersController.cs:line 173 at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)Inner Exception 1: UpdateException: An error occurred while updating the entries. See the inner exception for details.
Inner Exception 2: SqlException: Cannot insert the value NULL into column 'OrderNumber', table 'C:\REPOSITORY\BITBUCKET\OTHERPROJECTS\WEBAPISAMPLE\WEBAPISAMPLE\APP_DATA\DATA.MDF.dbo.Orders'; column does not allow nulls. INSERT fails. The statement has been terminated.
这段代码是在WebPOST方法中编写的API:
[HttpPost]
public IHttpActionResult Orders(Order neworder)
{
if (neworder == null)
{
return BadRequest();
}
string uri = Url.Link("DefaultApi", new { id = neworder.OrderNumber });
try
{
using (OrderContext db = new OrderContext("ConnectionString"))
{
if (neworder == null)
{
return BadRequest();
}
db.Orders.Add(neworder);
db.SaveChanges();
}
}
catch (Exception ex)
{
throw ex;
}
return Created<Order>(uri, neworder);
}
Order
实体:
namespace WebApiSample.Models
{
public class Order
{
[Key]
public int OrderNumber { get; set; }
public Decimal OrderAmount { get; set; }
public DateTime OrderDate { get; set; }
public string CustomerName { get; set; }
public int OrderQty { get; set; }
[Column("ShippingStatusFlag")]
public string ShippingStatus { get; set; }
public virtual ICollection<OrderItems> Items { get; set; }
}
}
OrderItems
实体:
namespace WebApiSample.Models
{
[Table("OrderItems")]
public class OrderItems
{
[Key]
[ForeignKey("Order")]
[Column(Order =1)]
public int OrderNumber { get; set; }
[Key]
[Column(Order = 2)]
public int ItemID { get; set; }
[Key]
[Column(Order = 3)]
public int ItemSeq { get; set; }
public Decimal ItemPrice { get; set; }
public string ItemDescription { get; set; }
public int ItemQty { get; set; }
public virtual Order Order { get; set; }
}
}
在POST请求体中传递的数据是
{
"OrderNumber": 9000,
"OrderAmount": 20,
"OrderDate": "2018-01-15T00:00:00",
"CustomerName": "TEST",
"OrderQty": 3,
"ShippingStatus": "N",
"Items": [
{
"OrderNumber": 9000,
"ItemID": 535,
"ItemSeq": 1,
"ItemPrice": 10,
"ItemDescription": "Plantronics Bluetooth Headset",
"ItemQty": 1,
"order": null
},
{
"OrderNumber": 9000,
"ItemID": 536,
"ItemSeq": 2,
"ItemPrice": 5,
"ItemDescription": "Yellow StickyNote 100ct",
"ItemQty": 1,
"order": null
},
{
"OrderNumber": 9000,
"ItemID": 601,
"ItemSeq": 3,
"ItemPrice": 5,
"ItemDescription": "Black Think Permanent Marker",
"ItemQty": 1,
"order": null
}
]
}
是什么导致了这个问题?我在这里做错了什么?
将您的 OrderNumber
属性 修改为 DatabaseGeneratedAttribute
public class Order
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int OrderNumber { get; set; }
...
}
背景:当单个整数属性标记为Key
时,默认设置为DatabaseGeneratedOption.Identity
。使用此设置,EF 假定数据库将负责分配新的主键值。所以对于状态为 Added
的实体,key 列将被忽略,不会被传输到数据库中。
这解释了为什么错误是关于 属性 的 NULL
值的,在代码中甚至不能为空。