【问题标题】:Web API error: "Cannot insert the value NULL into column 'Id'Web API 错误:“无法将值 NULL 插入到列 'Id'
【发布时间】:2015-07-21 00:47:07
【问题描述】:

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

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

“无法将值 NULL 插入到列 'Id'、表 'Members' 中;列不允许空值。INSERT 失败。语句已终止。”

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

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

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

这是数据库:

这是我的 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);
}

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; }
}

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

   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)

如果您能帮我找出问题,我将不胜感激。

【问题讨论】:

  • 能否请您发布在服务器端实际处理 POST/PUT 请求的代码?仅仅因为您发送带有 ID 的 JSON 数据并不意味着服务器正在使用它做任何事情
  • 我现在才插入,抱歉,谢谢。
  • Members 类在哪里????
  • 我现在才插入,抱歉,谢谢。它是由 EF 自动生成的。
  • 成员类是 EF 从数据库中自动生成的。所以我想如果它是必需的,那么它就会在那里。但不确定。感谢您的帮助。

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


【解决方案1】:

我要感谢这里的每个人的帮助...你们真的很棒。

经过数小时的挖掘,我终于找到了一个可行的解决方案,鉴于我使用 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; }
}

希望对大家有所帮助,再次感谢大家的帮助。

【讨论】:

  • 在重新编译 EF 模型时,这个(更改)不会被覆盖吗,因为这个类是自动生成的?
【解决方案2】:

对于这个对象:

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"}

这导致了与上面相同的 null 错误。 RecipeId 不能为空。我通过使用Public int? RecipeId{get;set;} 在短期内解决了这个问题。但这引起了其他问题。我找到了更好的解决方案。

我发现如果我在没有recipeId 字段的情况下设置相同的数据(如下所示),我没有收到错误消息。 recipeId 字段自动填充到数据库中。

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

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

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多