所以我正在做的是我从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()
我的问题是:当表(下面的屏幕截图)中没有空值时,为什么我会传递空值?我在俯瞰什么?
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;
}
}
答案 0 :(得分:2)
您没有收到该错误,因为您正在从数据库中读取空值,因为您正在尝试插入null,所以您正在获取该值值进入数据库。
Use the debugger评估GetResponse()
方法的结果。赔率是FrameSizeID
属性之一为空。
答案 1 :(得分:1)
问题在于EF映射。属性FrameSizeID
将属性StoreGeneratedPattern
设置为identity
,这意味着EF将永远不会尝试在插入时提供值。您需要删除它,以便EF知道您将在数据库中创建新记录时提供值。由于EF不提供值且值不能为null,因此会生成您遇到的异常。
为属性StoreGeneratedPattern
将None
的值设置为FrameSizeID
。
这是基于提供以下屏幕截图的最新评论: