带有接口的 .net-core Web API 的 CRUD 操作 - saveChanges() 不存在



概述

我正在用简单的CRUD操作制作一个.net-corewebneneneba API。

我已经制作了GET方法并使其运行,但是当我尝试使用dbContext.Add(myItem)实现Create方法时,我无法在之后使用dbContext.SaveChanges()。

我目前的作品可在以下网址获得:https://github.com/petermefrandsen/TKD-theory-API

到目前为止

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

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

代码

控制器:

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

IContext:

DanTheoryItem PostDanTheoryItem(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类继承,则该方法将在控制器中向您公开。

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

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

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

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

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

最新更新