在数据库表

时间:2016-07-07 19:24:08

标签: c# entity-framework web

所以我正在做的是我从api端点获取响应,将其保存到我的数据库表中,然后显示表内容。

我已经找到了可能的原因,为什么人们可以得到一个空值,如http://www.sql-server-helper.com/error-messages/msg-515.aspx所述,在这种情况下,这些原因都不适用。

对于此特定表,我收到异常错误

  

更新条目时发生错误。查看内部异常   详情。

以下是我收到的异常消息:

  

发生了错误。    无法将值NULL插入列中   ' FrameSizeID',table' diafirearmserver.dbo.Reference_Frame_Sizes&#39 ;;   列不允许空值。 INSERT失败。声明一直如此   终止。   System.Data.SqlClient.SqlException    在   System.Data.SqlClient.SqlCommand<> c.b__167_0(任务1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke()   在System.Threading.Tasks.Task.Execute()---堆栈跟踪结束   抛出异常的先前位置--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.d__0.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.d__0.MoveNext()    

我的问题是:当表(下面的屏幕截图)中没有空值时,为什么我会传递空值?我在俯瞰什么?

Here is a screenshot of the table that feeds the 'External api endpoint' 这是我的数据模型:

namespace FirearmsAPI.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Reference_Frame_Sizes
    {
        public int FrameSizeID { get; set; }
        public string FrameSize { get; set; }
    }
}

这是我的控制器:

public class Reference_Frame_SizesController : ApiController
{
    private DataEntities db = new DataEntities();
    static string _address = "http://localhost:57454/api/Reference_Frame_Sizes?format=json";
    private List<Reference_Frame_Sizes> result;

    // GET: api/Reference_Frame_Sizes
    /// <summary>
    /// Retrieves Firearm Frame size data from external api endpoint, saves data to DB and returns Data
    /// </summary>
    public async Task<IEnumerable<Reference_Frame_Sizes>> GetReference_Frame_Sizes()
    {
        db.Database.ExecuteSqlCommand("TRUNCATE TABLE Reference_Frame_Sizes"); //Truncates internal table

        List<Reference_Frame_Sizes> resultset = await GetResponse();
        foreach (Reference_Frame_Sizes manu in resultset)
        {
            db.Reference_Frame_Sizes.Add(manu);
        }
        await db.SaveChangesAsync();
        return db.Reference_Frame_Sizes;
    }

    private async Task<List<Reference_Frame_Sizes>> GetResponse()
    {
        var client = new HttpClient();
        HttpResponseMessage response = await client.GetAsync(_address);
        response.EnsureSuccessStatusCode();
        result = await response.Content.ReadAsAsync<List<Reference_Frame_Sizes>>();
        return result;
    }

protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool Reference_Frame_SizesExists(int id)
    {
        return db.Reference_Frame_Sizes.Count(e => e.FrameSizeID == id) > 0;
    }
}

2 个答案:

答案 0 :(得分:2)

您没有收到该错误,因为您正在从数据库中读取空值,因为您正在尝试插入null,所以您正在获取该值值进入数据库。

Use the debugger评估GetResponse()方法的结果。赔率是FrameSizeID属性之一为空。

答案 1 :(得分:1)

问题在于EF映射。属性FrameSizeID将属性StoreGeneratedPattern设置为identity,这意味着EF将永远不会尝试在插入时提供值。您需要删除它,以便EF知道您将在数据库中创建新记录时提供值。由于EF不提供值且值不能为null,因此会生成您遇到的异常。

解决方案概述

为属性StoreGeneratedPatternNone的值设置为FrameSizeID

Supporting Documentation

注意

这是基于提供以下屏幕截图的最新评论:

EF Properties for FrameSizeID