Web API错误:"无法将值NULL插入列' Id'

时间:2015-07-21 00:47:07

标签: c# sql-server entity-framework asp.net-web-api

我正在使用Web API并使用fiddler中的get方法和表中的一些示例数据,我可以从中获取数据。

当我尝试使用post方法插入新记录时,出现错误:

  

"不能将值NULL插入列' Id',table' Members&#39 ;;列不允许空值。 INSERT失败。该声明已被终止。"

问题是,我实际上是在JSON字符串中提供Id的值。我正在复制我从get / id方法获得的json字符串,只是更改Id。

我在表上有一个名为Id的列,它被设置为不允许空值,并且未设置为自动增量。这是因为系统的要求只要求它存在且独特。它不必是顺序的。所以我希望插入的人能够提供自己的id。

我不明白为什么会出现这个错误,因为我提供了所需的所有数据。

这是数据库:

enter image description here

这是我的JSON字符串:

{
"Id":687,
"FirstName":"auto",
"EMail":"auto",
"Eligible":true,
"InsertLogtime":"2015-07-21T00:51:59.917"
}

这是服务器端代码:不包含它的道歉。当我在调试器中进入此步骤时,成员类实际上已使用Id进行初始化。

// POST api/Members
[ResponseType(typeof(Members))]
public IHttpActionResult PostMembers(Members members)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    db.Members.Add(members);
    db.SaveChanges();

    return CreatedAtRoute("DefaultApi", new { id = members.Id }, members);
}

enter image description here

会员班,按要求:

public partial class Members
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string EMail { get; set; }
    public Nullable<bool> Eligible { get; set; }
    public Nullable<System.DateTime> InsertLogtime { get; set; }
}

下面是最外层的异常堆栈跟踪...

   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at Xyz.Service.Controllers.MembersController.PostMembers(Members members) in c:\Repositories\Xyz\Xyz.Service\Controllers\MembersController.cs:line 41
   at lambda_method(Closure , Object , Object[] )
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>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)

我真的很感激找到问题的任何帮助。

2 个答案:

答案 0 :(得分:2)

我要感谢大家的帮助......你真的很棒。

我终于找到了一个解决方案,经过几个小时的挖掘工作后,我使用S / O作为我自己的参考,我决定把它放在这里。如果有人能想到一个应该有效的替代方案,我真的很想听听它。

这是我的解决方案:

在上面的EF Autogenerated Members类中:

public partial class Members
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string EMail { get; set; }
    public Nullable<bool> Eligible { get; set; }
    public Nullable<System.DateTime> InsertLogtime { get; set; }
}

只需添加以下行:

public partial class Members
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string EMail { get; set; }
    public Nullable<bool> Eligible { get; set; }
    public Nullable<System.DateTime> InsertLogtime { get; set; }
}

我希望其他人觉得有帮助,并再次感谢大家的帮助。

答案 1 :(得分:1)

对于这个对象:

public class Recipe
{
    public int RecipeId { get; set; }
    [Required]
    public string Title { get; set; }
    public string Source { get; set; }
    public CategoryEnum Category { get; set; }
    public string Instructions { get; set; }
    public virtual ICollection<RecipeNote> Notes { get; set; }
}

当我尝试从JavaScript发布以下内容时,我会看到您上面报告的相同错误:

{"recipeId":"","title":"test","category":1,"source":"test","instructions":"test"}

这会导致上面出现的同样的空错误。 RecipeId不能为空。我使用Public int? RecipeId{get;set;}将其修复为短期。但这导致了其他问题。我找到了更好的解决方案。

我发现如果我在没有recipeId字段的情况下提出相同的数据(如下所示),我没有得到错误。 recipeId字段在数据库中自动填充,应该是这样。

{"title":"test","category":1,"source":"test","instructions":"test"}

所以我认为最好的解决方法是在将数据发布到Web API函数以添加记录时排除ID字段。

希望这有助于某人。