C# 带接口的.net核心web API的CRUD操作-saveChanges()不';不存在 概述

C# 带接口的.net核心web API的CRUD操作-saveChanges()不';不存在 概述,c#,sql-server,api,asp.net-core-mvc,crud,C#,Sql Server,Api,Asp.net Core Mvc,Crud,我正在制作一个带有简单CRUD操作的.net核心web API 我已经创建了GET方法,并让它们启动并运行,但是当我尝试使用dbContext.Add(myItem)实现Create方法时,之后我无法使用dbContext.SaveChanges() 我目前的工作可在以下网址查阅: 目前为止 我已尝试将覆盖方法添加到数据库上下文中。 此外,我还尝试将实体框架引用添加到项目中 由于我确实使用接口实现松耦合,当我与教程和其他人比较类似的问题时,我感到不知所措。(阅读我对c#还相当陌生) 代码 控制

我正在制作一个带有简单CRUD操作的.net核心web API

我已经创建了GET方法,并让它们启动并运行,但是当我尝试使用dbContext.Add(myItem)实现Create方法时,之后我无法使用dbContext.SaveChanges()

我目前的工作可在以下网址查阅:

目前为止 我已尝试将覆盖方法添加到数据库上下文中。 此外,我还尝试将实体框架引用添加到项目中

由于我确实使用接口实现松耦合,当我与教程和其他人比较类似的问题时,我感到不知所措。(阅读我对c#还相当陌生)

代码 控制器:

[Route("dan/")]
[HttpPost]
public ActionResult<DanTheoryItem> PostDanTheoryItem(DanTheoryItem danTheoryItem)
{
    _context.PostDanTheoryItem(danTheoryItem);
    return new ActionResult<DanTheoryItem>(danTheoryItem);
}
背景:

public DanTheoryItem PostDanTheoryItem(DanTheoryItem danTheoryItem)
{
    var theoryItem = new DbDanTheoryItems
    {
        Id = danTheoryItem.Id,
        KoreanTheoryItemId = danTheoryItem.KoreanTheoryItemId,
        MainCategory = danTheoryItem.MainCategory,
        SubCategory = danTheoryItem.SubCategory,
        SubToSubCategory = danTheoryItem.SubToSubCategory,
        NameLatin = danTheoryItem.NameLatin,
        NamePhonetic = danTheoryItem.NamePhonetic,
        NameAudio = danTheoryItem.NameAudio
    };
    _dbContext.DanTheoryItems.Add(theoryItem);
    //_dbContext.SaveChanges();
    return danTheoryItem;
}
期望结果
我想让控制器调用将所需数据写入数据库的上下文方法。

您的界面不包含SaveChanges方法。由于您使用的是依赖项注入,因此只有接口中的方法可供控制器使用。 如果从自定义接口中的System.Data.Entity.IDbContext类继承,则该方法将在控制器中向您公开


在控制器中实例化DblokiSautTkdTheoryAppContext类的实例也将公开SaveChanges方法

很难说清楚,因为您忽略了发布代码的某些关键部分。但是,我最好的猜测是,您的“上下文”是由
IDbContext
(您自己创建的)提供的,而不是
DbContext
,并且您的接口没有定义
SaveChanges
方法

老实说,只要去掉
IDbContext
。接口的要点是定义多个实现之间的契约。这里只能有一个实现:
DbContext
,而
DbContext
甚至不知道这个接口。只需直接注入派生的
DbContext

使用界面不是一根魔杖。在这里,您对实体框架有着很强的依赖性,所以不管接口与否,您都是紧密耦合的。但这并不是件坏事。EF作为您的数据层,此应用程序是数据驱动的;无论发生什么,它都将与数据层紧密耦合


API本身就是您的抽象。其他层可能只使用API,因此不需要进一步的抽象,实际上只是增加了更多的维护问题,没有额外的好处。

我同意。但是,除此之外,我还建议使用存储库模式以更容易地进行测试。不,不,不,一百万次不。存储库模式在这里是错误的,因为EF是一个已经实现此模式的ORM。此外,EF已经是可测试的;测试不需要存储库层。我不认为这个问题的答案像您所说的那样明确,因为该模式有几个优点。尽管如此,您确实可以利用内存中的数据库进行测试。不,这是非常明确的。存储库模式有一个目的:抽象出低级数据库查询逻辑。类似于实体框架的ORMs已经做到了这一点。对于使用不同的模式(如CQR、微服务等)提供额外的好处,可能会有争论,但不是因为存储库模式。感谢您对我的问题和界面使用的深入了解-我现在已将其安装并运行,并在构建API代码方面获得了进一步的了解。非常感谢您的回答。这对我进一步了解post请求非常有帮助!
public DanTheoryItem PostDanTheoryItem(DanTheoryItem danTheoryItem)
{
    var theoryItem = new DbDanTheoryItems
    {
        Id = danTheoryItem.Id,
        KoreanTheoryItemId = danTheoryItem.KoreanTheoryItemId,
        MainCategory = danTheoryItem.MainCategory,
        SubCategory = danTheoryItem.SubCategory,
        SubToSubCategory = danTheoryItem.SubToSubCategory,
        NameLatin = danTheoryItem.NameLatin,
        NamePhonetic = danTheoryItem.NamePhonetic,
        NameAudio = danTheoryItem.NameAudio
    };
    _dbContext.DanTheoryItems.Add(theoryItem);
    //_dbContext.SaveChanges();
    return danTheoryItem;
}