gpt4 book ai didi

c# - Entity Framework 在三个表中拉空

转载 作者:行者123 更新时间:2023-11-30 20:57:02 25 4
gpt4 key购买 nike

我的数据库中有三个表。每个表都适用于不同的实体类,代码:

public class Quizs
{
[Key]
public int QuizId { get; set; }
public string Title { get; set; }
public string Instructions { get; set; }
public string IsTimerEnabled { get; set; }
public virtual ICollection<Question> Questions { get; set; }
}

public class Question
{
[Key]
public int QuestionId { get; set; }
public virtual ICollection<Answers> Answers { get; set; }
public int RightAnswer { get; set; } // Key of Answers[]
public int QuestionType { get; set; } // 1 = One choise, 2 = Multiple Choise
public string Explantion { get; set; } // To appear after answering the question
public int MaxTime { get; set; } // In seconds
}

public class Answers
{
[Key]
public int asId { get; set; }
public int Id { get; set; }
public string Text { get; set; }
}

所以现在我需要将这三个表中的数据全部输出到WebApi页面。

这是在 Controller 中提取数据的代码:

// GET api/QuizsData/
public IEnumerable<Quizs> Get()
{

return dba.Quiz.Include("Questions").Include("Questions.Answers").ToList();
}

这是当我转到 api 的路由时得到的:

{"Message":"An error has occurred.","ExceptionMessage":"Invalid column name 'Question_QuestionId'.\r\nInvalid column name 'Question_QuestionId'.","ExceptionType":"System.Data.SqlClient.SqlException","StackTrace":" at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction)\r\n at
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection, Action
1 wrapCloseInAction)\r\n
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\r\n
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)\r\n at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()\r\n at System.Data.SqlClient.SqlDataReader.get_MetaData()\r\n at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)\r\n at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)\r\n at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)\r\n at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)"}

我收到此异常消息..有什么帮助吗?

谢谢!

最佳答案

我不认为你已经按照你认为的方式建立了你的关系。

尝试这些改变:

public class Quizs
{
// no attribute
public virtual ICollection<Question> Questions { get; set; }
}

public class Question
{
// no attribute
public virtual ICollection<Answers> Answers { get; set; }

// add
[ForeignKey("Quiz")]
public int QuizId { get; set; }
public virtual Quizs Quiz { get; set; }
}

public class Answers
{
// add
[ForeignKey("Question")]
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
}

(另外,考虑将类名改为单数。这样可以减少语义混淆。)


关于什么是什么的更多解释:

您在这里要实现的目标称为一对多关系。例如,您有很多问题指向一个测验。或者你有很多答案指向一个问题。在问答关系中,问答是“一”方,问题是“多”方。在问答关系中,问题是“一”方,答案是“多”方。

要在 Entity Framework 中实现这样的关系,您所要做的就是转到关系的“多”面并添加如下内容:

public virtual Quiz Quiz { get; set; }

然后转到关系的“一方”并添加如下内容:

public virtual ICollection<Question> Questions { get; set; }

Entity Framework 理解第一个声明的意思是“为表 Quiz 创建一个外键”,另一个意思是“Question 表的多条记录将指向这里” .

这就像普通类之间的关系一样工作,只是您将属性设置为虚拟,以便 Entity Framework 可以在运行时使用实际实现此关系的属性覆盖它们。

现在的情况是,从您的(“多”方)模型,您无权访问在数据库中创建的外键。您确实可以访问它所指的记录,但不能访问外键本身(至少不能不获取其他记录)。要解决此问题,您可以告诉 Entity Framework 使用显式声明的属性作为外键,如下所示:

[ForeignKey("Quiz")]
public int QuizId { get; set; }

ForeignKey 属性表示以下 int 属性 (QuizId) 将是属性 Quiz 使用的实际外键,而不是让它在我们无法访问的表中隐式创建自己的外键。

换句话说:无论如何都会创建一个外键,因为您引用了另一个模型。该属性表示您想要自己访问该外键。在大多数情况下,您会需要这个。

关于c# - Entity Framework 在三个表中拉空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17143091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com