【问题标题】:Add/Update list in database using Entity framework 6使用实体框架 6 在数据库中添加/更新列表
【发布时间】:2014-09-04 09:46:56
【问题描述】:

我有三个表 QuestionBank、Question 和 Answer。 “ QuestionBank ”将有问题列表,“ Question ”将有“ Answer ”列表。

题库:-

public class QuestionBank
{
public int id { get; set; }
public string Text { get; set; }
public string Chapter { get; set; }
public string Standard { get; set; }
public List<Question> Question { get; set; }
public QuestionBank()
{
this.Question = new  List<Question>();
}
}

问题:-

public class Question
{
public int id { get; set; }
public string Title { get; set; }
public string QuestionText { get; set; }
public List<Answer> Answer { get; set; }
public string CorrectAnswer { get; set; }
public Question()
{
    this.Answer = new List<Answer>();
}
}

答案:-

public class Answer
{
public int id { get; set; }
public string AnswerText { get; set; }
}

WEB API :- //已编辑

  private IRepository<QuestionBank> _QuestionBankRepository;  
  public QuestionController(IRepository<QuestionBank> QuestionBankRepository)
    {
        _QuestionBankRepository = QuestionBankRepository;  
    }
[HttpPost]
[Route("Ques/Add")]
    public Boolean Add(QuestionBank AddQuetionBankData)
    {
        var isQuetionBankPresent = _QuestionBankRepository.GetAll(p => p.Text == AddQuetionBankData.Text && p.Standard == AddQuetionBankData.Standard && p.Chapter == AddQuetionBankData.Chapter).FirstOrDefault<QuestionBank>();
        if (isQuetionBankPresent != null)
        {
            /* Add the data in Question and Answer tables  */
            return false;
        }
        else
        {
            /* Add the data in all three tables  */
            return true;
        }
    }

我有这个用于 web api 的数据库。现在我想通过 json { "QuestionBank": QuestionBank, "Question": Question, "Answer": Answer } 添加数据库中的数据,如果 QuestionBank 中存在该行我不想在 QuestionBank 表中添加该数据,只添加问答表中的数据与各自的外键。我正在使用实体框架和 mvc 5 web api。我被困在这一点上。如果需要任何东西,请告诉我。提前致谢。

【问题讨论】:

    标签: entity-framework asp.net-mvc-5 entity-framework-6 asp.net-web-api2


    【解决方案1】:

    实体框架的更新方式是到Context.Entry([your object]).State = System.Data.Entity.EntityState.Modified;,前提是对象的类型正确。

    public Boolean Add(QuestionBank AddQuetionBankData)
    {
    
        bool flag = false;
    
        var question = this.MapToQuestion(AddQuetionBankData); //map the input to the EF Type Question
        var anwer = this.MapToAnswer(AddQuetionBankData); //map the input to the EF Type Answer
    
        var isQuetionBankPresent = _QuestionBankRepository.GetAll(p => p.Text == AddQuetionBankData.Text && p.Standard == AddQuetionBankData.Standard && p.Chapter == AddQuetionBankData.Chapter).FirstOrDefault<QuestionBank>();
        if (isQuetionBankPresent != null)
        {
            _context.Entry(question).State = EntityState.Modified;
            _context.Entry(answer).State = EntityState.Modified;
            /* Add the data in Question and Answer tables  */
            flag = false;
        }
        else
        {
            _context.Entry(question).State = EntityState.Modified;
            _context.Entry(answer).State = EntityState.Modified;
            _context.Entry(AddQuetionBankData).State = EntityState.Modified;
            /* Add the data in all three tables  */
            flag = true;
        }
    
        _context.SaveChanges();
    
        return flag;
    }
    
    private Question MapTo Question(QuestionBank q) //do this for Answers too
    {
        var _q = _context.Question.Where(a=>a.Id == q.Id).SingleOrDefault();
    
        if(_q!=null)
        {
              _q.id = q.id; //this is already true
              _q.Title = q.Title;
              _q.QuestionText = q.Standard; //I guess
        }
    
        return _q;
     }
    

    EF 根据其类型更新实体(传递给方法Entry() 的类)。

    注意SaveChanges() 的位置:它的工作方式类似于存储过程,您执行所有更新,SaveChanges() 就像 SQL 的COMMIT 命令。

    您还应该将 SaveChanges 包装在 try/catch 中以处理错误,并处置 _context。

    编辑

    该类具有 IRepository&lt;Question&gt;IRepository&lt;QuestionBank&gt;IRepository&lt;Answer&gt; 的依赖项。

    您应该创建一个 UpdateController(或 PublishController 或其他),在构造函数中获取三个依赖项(更好的是 Facade Service),并为每个依赖项调用 Add() 方法。

    如果您直接访问raw Database object,您可以像我一样对每个表使用Entry() 方法。

    【讨论】:

    • 感谢@fra9001 的快速回复。我已将 _QuestionBankRepository 对象说明放在“Web Api”中。没错,我必须使用“ Context.Entry([your object]).State = System.Data.Entity.EntityState.Modified; ”进行更新,但我找不到方法,因为“ _QuestionBankRepository ”对象指的是“ QuestionBank 表格。
    • 通过为 QuestionBank 和 Question 创建 ViewModel 解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多