我正在通过简单的CRUD操作制作一个.net-core Web 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;
}
我想让控制器调用上下文方法,这些方法会将所需的数据写入数据库。
答案 0 :(得分:1)
您的界面不包含SaveChanges方法。由于您正在使用依赖项注入,因此控制器中仅接口中的方法可用。 如果您从自定义界面中的System.Data.Entity.IDbContext类继承,则该方法将在您的控制器中向您公开。
在控制器中实例化DbLokisaurTKDTheoryAppContext类的实例也将公开SaveChanges方法。
答案 1 :(得分:1)
很难确切地说是因为您忽略了发布代码的某些关键部分。但是,我最好的猜测是,{context”是由您自己创建的IDbContext
,而不是DbContext
,并且您的界面未定义SaveChanges
方法。 / p>
老实说,只要摆脱IDbContext
。接口的重点是定义多个实现之间的协定。在这里,只能有一个实现:DbContext
,而DbContext
甚至都不知道这个接口。只需直接注入派生的DbContext
。
使用界面不是魔杖。您在这里对Entity Framework有着很强的依赖性,因此无论接口与否,您都紧密相连。不过,这并不是坏的事情。 EF充当您的数据层,并且此应用程序是数据驱动的;无论如何,它都将与数据层紧密耦合。
API本身就是您的抽象。大概其他层将仅使用API,因此不需要进一步的抽象,并且实际上只是增加了更多的维护问题,而没有任何额外的好处。