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