具有接口的.net核心Web API的CRUD操作-saveChanges()不存在

时间:2019-02-04 19:00:14

标签: c# sql-server api asp.net-core-mvc crud

概述

我正在通过简单的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;
}

所需结果

我想让控制器调用上下文方法,这些方法会将所需的数据写入数据库。

2 个答案:

答案 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​​,因此不需要进一步的抽象,并且实际上只是增加了更多的维护问题,而没有任何额外的好处。