概述
我正在用简单的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,因此不需要进一步的抽象,实际上只是增加了更多的维护问题,而没有增加任何好处。