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