C# 实体验证失败

C# 实体验证失败,c#,asp.net,.net,sql-server,C#,Asp.net,.net,Sql Server,我正在尝试使用后台服务更新SQL Server数据库。数据取自第三个api,我还创建了表和实体。然而,当我运行我的程序时,我发现了一个验证失败的例外。 这是表格: CREATE TABLE [dbo].[Trivia] ( [QID] INT IDENTITY (1, 1) NOT NULL, [Category] NVARCHAR (MAX) NOT NULL, [Type] NVARCHAR (MAX)

我正在尝试使用后台服务更新SQL Server数据库。数据取自第三个api,我还创建了表和实体。然而,当我运行我的程序时,我发现了一个验证失败的例外。 这是表格:

CREATE TABLE [dbo].[Trivia] (
[QID]              INT            IDENTITY (1, 1) NOT NULL,
[Category]         NVARCHAR (MAX) NOT NULL,
[Type]             NVARCHAR (MAX) NOT NULL,
[Difficulty]       NVARCHAR (MAX) NOT NULL,
[Question]         NVARCHAR (MAX) NOT NULL,
[Correct_answer]   NVARCHAR (MAX) NOT NULL,
[incorrect_answer] NVARCHAR (MAX) NOT NULL,
CONSTRAINT [PK_Trivia] PRIMARY KEY CLUSTERED ([QID] ASC)
))

这是我的方法从Global.asax调用的类

    {

    private static System.Timers.Timer timer;

    public static void schedulePhase()
    {
        timer = new System.Timers.Timer(10000);
        timer.Elapsed += new ElapsedEventHandler(GetQuestion);
        timer.Interval = 30000;
        timer.Enabled = true;
    }

        public static async void GetQuestion(object x, ElapsedEventArgs e)
        {
            using (var client = new HttpClient())
            {
                var response = await client.GetStringAsync("https://opentdb.com/api.php?amount=1");
                var question = new Trivia();
                question = JsonConvert.DeserializeObject<Trivia>(response);

                if (question != null)
                {
                    MyDatabaseEntities dc = new MyDatabaseEntities();

                    
                    dc.Trivias.Add(question);
                    dc.SaveChanges();

                }
} 现在,当我运行我的应用程序时,我被抛出了这个

System.Data.Entity.Validation.DbEntityValidationException:'一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。验证错误为:类别字段为必填项。;类型字段是必需的。;难度字段是必填的。;“问题”字段为必填项。;“正确答案”字段是必需的。;“不正确的回答字段是必需的。”


我错过了什么吗?

查看来自该web API的响应,返回的字符串是一个JSON编码的信封,其中包含字段
response\u code
results
,后者是可以反序列化到您创建的
琐事类中的对象列表


因此,您需要将
响应
结果[0]
提取到JSON解码器中,而不是整个响应字符串。

查看来自该web API的响应,返回的字符串是一个JSON编码的信封,其中包含字段
响应
结果
,后者是可以反序列化到您创建的
琐事类中的对象列表


因此,您需要将
响应
结果[0]
提取到JSON解码器中,而不是整个响应字符串。

表中的所有字段都是必需的

            //Here you instantiate your question object
            var question = new Trivia();
            question = JsonConvert.DeserializeObject<Trivia>(response);


            //So, here it won't be null. 
            if (question != null)
            {
                MyDatabaseEntities dc = new MyDatabaseEntities();

                //Here, if any property of the question object is null, you will have the validation error.
                dc.Trivias.Add(question);
                dc.SaveChanges();

            }
//在这里您可以实例化您的问题对象
变量问题=新的琐事();
问题=JsonConvert.DeserializeObject(响应);
//所以,这里它不会是空的。
如果(问题!=null)
{
MyDatabaseEntities dc=新的MyDatabaseEntities();
//在这里,如果问题对象的任何属性为null,则会出现验证错误。
dc.Trivias.Add(问题);
dc.SaveChanges();
}
对我来说,JsonConvert.DeserializeObject(响应);返回空。 因此,当您为NOTNULL数据库字段发送NULL时,就会出现此错误


我认为您应该检查它返回的反序列化内容。

表中的所有字段都是必需的

            //Here you instantiate your question object
            var question = new Trivia();
            question = JsonConvert.DeserializeObject<Trivia>(response);


            //So, here it won't be null. 
            if (question != null)
            {
                MyDatabaseEntities dc = new MyDatabaseEntities();

                //Here, if any property of the question object is null, you will have the validation error.
                dc.Trivias.Add(question);
                dc.SaveChanges();

            }
//在这里您可以实例化您的问题对象
变量问题=新的琐事();
问题=JsonConvert.DeserializeObject(响应);
//所以,这里它不会是空的。
如果(问题!=null)
{
MyDatabaseEntities dc=新的MyDatabaseEntities();
//在这里,如果问题对象的任何属性为null,则会出现验证错误。
dc.Trivias.Add(问题);
dc.SaveChanges();
}
对我来说,JsonConvert.DeserializeObject(响应);返回空。 因此,当您为NOTNULL数据库字段发送NULL时,就会出现此错误


我认为您应该检查它返回的反序列化内容。

此处找到的解决方案

此处找到的解决方案

代码看起来像MS SQL,也就是SQL Server one,而不是MySQL。DBMS标记被替换。此代码存在几个问题。HttpClient正在被处置,尽管它不应该被处置。DbContext不会被释放,即使它应该被释放
async void GetQuestion
是一个bug-
async void
仅用于事件处理程序,不能等待此类方法,这意味着应用程序不会等待此方法完成。该操作很容易在开始之前就被取消。对于不返回的异步方法,应该使用
async Task
data@PanagiotisKanavos我把它作为一个异步任务,但它在这里抛出异常“code”timer.appeased+=new-ElapsedEventHandler(GetQuestion);在计时课上。异常表示该方法没有返回值。事件处理程序是唯一使用
async void
的位置。不过,命名约定是使用类似于事件的名称,如
OneReleased
OneReleasedAsync
Eleased\u处理程序
,而不是
GetQuestion
。代码看起来像MS SQL aka SQL Server one,而不是MySQL。DBMS标记被替换。此代码存在几个问题。HttpClient正在被处置,尽管它不应该被处置。DbContext不会被释放,即使它应该被释放
async void GetQuestion
是一个bug-
async void
仅用于事件处理程序,不能等待此类方法,这意味着应用程序不会等待此方法完成。该操作很容易在开始之前就被取消。对于不返回的异步方法,应该使用
async Task
data@PanagiotisKanavos我把它作为一个异步任务,但它在这里抛出异常“code”timer.appeased+=new-ElapsedEventHandler(GetQuestion);在计时课上。异常表示该方法没有返回值。事件处理程序是唯一使用
async void
的位置。不过,命名约定是使用类似于事件的名称,如
onerelessd
onerelessdasync
eapersed\u Handler
,而不是
GetQuestion
,所以你说我应该
foreach(有问题的琐事x)
{dc.trivias.add(问题)?所以你说我应该
foreach(有问题的琐事x)
{dc.trivias.add(问题)?是的,你是对的,它确实返回空值…我不知道为什么你是对的,它确实返回空值…我不知道为什么