C# 当数据库表中没有空值时获取空值

C# 当数据库表中没有空值时获取空值,c#,entity-framework,web,C#,Entity Framework,Web,所以我要做的是从api端点获取响应,将其保存到我的DB表中,然后显示表内容 正如这里所解释的,我已经讨论了为什么可以得到一个空值的可能原因,这些原因都不适用于本例 对于这个特定的表,我得到一个异常错误 更新条目时出错。查看内部异常 详情请参阅 以下是我收到的异常消息: 发生了一个错误。 无法将值NULL插入到列中 “FrameSizeID”,表“diafirearmserver.dbo.Reference_Frame_size”; 列不允许空值。插入失败。声明已被修改 结束。 System.Da

所以我要做的是从api端点获取响应,将其保存到我的DB表中,然后显示表内容

正如这里所解释的,我已经讨论了为什么可以得到一个空值的可能原因,这些原因都不适用于本例

对于这个特定的表,我得到一个异常错误

更新条目时出错。查看内部异常 详情请参阅

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

发生了一个错误。 无法将值NULL插入到列中 “FrameSizeID”,表“diafirearmserver.dbo.Reference_Frame_size”; 列不允许空值。插入失败。声明已被修改 结束。 System.Data.SqlClient.SqlException 在 System.Data.SqlClient.SqlCommand.c.b\u 167\u 0(任务
1
结果)在
System.Threading.Tasks.ContinuationResultTaskFromResultTask
2.InnerInvoke() 在System.Threading.Tasks.Task.Execute()---堆栈结束跟踪 引发异常的上一个位置--- System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.d_u0.MoveNext() ---来自引发异常的上一个位置的堆栈结束跟踪---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.d_u0.MoveNext()

我的问题是:当表(下面的屏幕截图)中没有空值时,为什么要传递空值?我忽略了什么

以下是我的数据模型:

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;
    }
}
公共类引用\u框架\u大小控制器:ApiController
{
私有数据实体db=新数据实体();
静态字符串_地址=”http://localhost:57454/api/Reference_Frame_Sizes?format=json";
私有列表结果;
//获取:api/参考框架大小
/// 
///从外部api端点检索枪械帧大小数据,将数据保存到数据库并返回数据
/// 
公共异步任务GetReference\u Frame\u Sizes()
{
db.Database.ExecuteSqlCommand(“TRUNCATE TABLE Reference_Frame_size”);//截断内部表
List resultset=wait GetResponse();
foreach(结果集中的参考框架和制造尺寸)
{
db.参考框架尺寸。添加(手动);
}
等待db.saveChangesSync();
返回db.Reference\u Frame\u大小;
}
专用异步任务GetResponse()
{
var client=新的HttpClient();
HttpResponseMessage response=wait client.GetAsync(_地址);
response.EnsureSuccessStatusCode();
结果=wait response.Content.ReadAsAsync();
返回结果;
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
私有布尔参考帧大小存在(整数id)
{
返回db.Reference\u Frame\u size.Count(e=>e.FrameSizeID==id)>0;
}
}

您没有收到该错误,因为您正在从数据库中读取空值,您收到该错误是因为您试图将空值插入数据库中


评估
GetResponse()
方法的结果。很可能是
FrameSizeID
属性之一为空

您没有收到该错误,因为您正在从
数据库中读取空值,您收到该错误是因为您试图将空值插入
数据库


评估
GetResponse()
方法的结果。很可能是
FrameSizeID
属性之一为空

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

解决方案概述 将属性
FrameSizeID
StoreGeneratedPattern
的值设置为
None

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


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

解决方案概述 将属性
FrameSizeID
StoreGeneratedPattern
的值设置为
None

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


检查GetResponse方法中返回的结果。这可能是因为您从未在EF映射中映射过
FrameSizeID
。在这种情况下,EF将忽略insert上的那些值,并且默认为DB中的默认值
NULL
,除非您有默认约束设置并且正在使用Sql Server。这是一个猜测,因为您没有为
Reference\u Frame\u size
提供EF映射代码,但考虑到它是
int
属性,因此如果它已映射但没有va