当尝试添加项时,在Entity Framework中出现错误

3
当我试图向数据库上下文中添加项目时,会出现以下错误。 我正在Web API项目中使用Entity Framework。 下面显示了示例代码。
异常
System.Data.Entity.Infrastructure.DbUpdateException HResult=0x80131501 Message=更新条目时发生错误。 有关详细信息,请参见内部异常。 Source=EntityFramework StackTrace: 在System.Data.Entity.Internal.InternalContext.SaveChanges() 中 在 System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 中 在 System.Data.Entity.DbContext.SaveChanges() 中 在WebApiSample.Controllers.OrdersController.Orders(Order neworder)中 C:\ Repository \ bitbucket \ OtherProjects \ WebApiSample \ WebApiSample \ Controllers \ OrdersController.cs的第173行 在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor。<> c__DisplayClass10.b__9(Object instance,Object [] methodParameters)中 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance,Object [] arguments)中 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2 arguments,CancellationToken cancellationToken)中
内部异常1:UpdateException:更新条目时发生错误。 有关详细信息,请参见内部异常。
内部异常2:SqlException:无法将值NULL插入到列“OrderNumber”,表格'C:\ REPOSITORY \ BITBUCKET \ OTHERPROJECTS \ WEBAPISAMPLE \ WEBAPISAMPLE \ APP_DATA \ DATA.MDF.dbo.Orders'中,该列不允许为null。 INSERT失败。 该语句已终止。
此代码编写在Web API的POST方法中:
[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
            }
        ]
    }

这个问题可能是由什么引起的?我在这里做错了什么?

6
异常的信息是什么? - Chetan
1
你刚刚展示了堆栈跟踪。请在问题中导入完整的异常消息。 - Marcus Höglund
1
顺便问一下,将 throw ex; 替换为 throw; 怎么样? - grek40
1
也许你应该在 Order 类中的 OrderNumber 属性上设置属性 DatabaseGenerated(DatabaseGeneratedOption.None)。你的模型(期望自动递增键)和数据库/使用之间可能存在不匹配,期望显式键设置...或者 OrderNumber 条目是否指向现有的数据库行? - grek40
1
@grek40:在Order类的OrderNumber属性上添加[DatabaseGenerated(DatabaseGeneratedOption.None)]解决了我的问题。谢谢! - BipinR
显示剩余6条评论
1个回答

6

使用DatabaseGeneratedAttribute修改您的OrderNumber属性

public class Order
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int OrderNumber { get; set; }

    ...
}

背景:当一个单独的整数属性被标记为Key时,默认设置为DatabaseGeneratedOption.Identity。使用此设置,EF假定数据库将负责分配一个新的主键值。因此,对于具有Added状态的实体,关键列将被忽略并且不会传输到数据库。
这就解释了为什么错误是关于代码中甚至不可为空的属性的NULL值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接