dbContext不更新数据库

时间:2019-05-28 21:36:27

标签: c# .net-core entity-framework-core dbcontext

当我保存对DbContext的更改时,它不会更新数据库。也没有错误。

是的,将填写传入的表单数据。是的,连接字符串正确,我知道这一点,因为我能够从数据库中很好地检索数据。如果相关,那就是多对多的关系。

就您而言,路线图就像一篇文章,可以与许多标签关联。

<div id="parent">
    <div>
        <a href="#">First</a>
        <a href="#">second</a>
        <a href="#">third</a> <!--I wanna delete this-->
    </div>
</div>

在创建dbcontext的地方,这是Startup.cs的构造函数。

requestObjectIntent['slots'][slotValue] = requestObjectIntent['slots']['toChange];
delete(requestObjectIntent['slots']['toChange']);

我没有收到任何错误,并且数据库中也没有添加任何内容。我可能在这里做了根本上错误的事情。预先感谢。

1 个答案:

答案 0 :(得分:2)

您正在使用异步编程,但是您的方法不是异步的。

在使用异步方法时使用dbContext.SaveChangesAsync();,在不异步时使用dbContext.SaveChanges();

此外,您正在使用静态类,如果您使用依赖项注入,则情况并非如此。 DI将处理您对象的生命周期。

您的类未正确定义,您有一些格式错误,并且应如下所示:

public class RoadmapService
{
    private readonly ConkerDbEntities _dbContext;

    public RoadmapService(ConkerDbEntities dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task AddToDatabase(Form form)
    {
        Roadmaps roadmap = new Roadmaps {
            RoadmapTitle = form.title, 
            RoadmapSummary = form.summary, 
            RoadmapBody = form.body 
        };

        var tags = new Tags[form.tags.Length];

        for(int i = 0; i < tags.Length; i++)
        {
            tags[i] = new Tags();
            tags[i].TagId = form.tags[i];
        }

        var roadmapTags = new RoadmapTags[form.tags.Length];

        for(int i = 0; i < tags.Length; i++)
        {
            roadmapTags[i] = new RoadmapTags{Roadmap = roadmap, Tag = tags[i]};
        }

        _dbContext.AddRange(roadmapTags);
        _dbContext.SaveChangesAsync();
    }
}

然后,您可以在控制器中按原样使用服务

public class OrdersController : Controller
{
    private readonly RoadmapService _roadmapService;

    public OrdersController(RoadmapService roadmapService)
    {
        _roadmapService = roadmapService;
    }

    [HttpGet]
    [Route("api/[controller]/{folio}")]
    public async Task<IActionResult> Status(string folio)
    {
        await _roadmapService.AddToDatabase(something);
        return Ok();
    }
}

我还建议研究有关linq以及如何使用select avoid those foreach cycles并检查默认net core coding standards

编辑

  

我很好奇,在这种情况下LINQ能提供任何性能优势吗?   vs只是常规的for循环?

更多有关代码的可读性和可维护性,在答案中,我已经添加了一篇文章的链接,该文章可以得到更好的解释,您正在代码中创建technical debt,正在初始化数组并填充它们,处理索引等...,但简化为:

什么更容易阅读?这个:

public async Task AddToDatabase(Form form)
{
    Roadmaps roadmap = new Roadmaps {
        RoadmapTitle = form.title, 
        RoadmapSummary = form.summary, 
        RoadmapBody = form.body 
    };

    var tags = new Tags[form.tags.Length];

    for(int i = 0; i < tags.Length; i++)
    {
        tags[i] = new Tags();
        tags[i].TagId = form.tags[i];
    }

    var roadmapTags = new RoadmapTags[form.tags.Length];

    for(int i = 0; i < tags.Length; i++)
    {
        roadmapTags[i] = new RoadmapTags{Roadmap = roadmap, Tag = tags[i]};
    }

    _dbContext.AddRange(roadmapTags);
    _dbContext.SaveChangesAsync();
}

或这个

    public async Task AddToDatabase(Form form)
    {
        var roadmap = new Roadmap {
            RoadmapTitle = form.title, 
            RoadmapSummary = form.summary, 
            RoadmapBody = form.body 
        };

        var roadmapTags = form.Tags
            .Select(tagId => new Tag        // First we take our form.tags and convert it to Tag objects
            {
                TagId = tagId
            })
            .Select(tag => new RoadmapTags  // Then we take the result of the previous conversion and we 
            {                               // transform again to RoadmapTags, we even could do this in one pass
                Roadmap = roadmap,          // but this way is more clear what the transformations are
                Tag = tag
            })
            .ToList();

        _dbContext.AddRange(roadmapTags);
        await _dbContext.SaveChangesAsync();
    }

如果您刚刚开始学习编程,则可以忽略它,直到对forforeachwhile和其他control structures感到更舒服为止。这是结构编程,它本身就是一个主题。

  

我还将如何将roadmapService对象传递给Controller   构造函数,我只是从未见过。

这就是依赖项注入的魔力,只需让系统为您创建对象,您只需要询问类型即可。

这也是一个大话题,您应该检查我以前指向microsoft文档的链接,但是基本上,您所要做的就是将类定义为依赖项,因此,当您请求一个类时,系统本身会检查依赖项,以及该对象的依赖关系,直到解析所有依赖关系树为止。

有了这个,如果您的类中又需要一个依赖项,则可以直接添加,但不需要修改所有使用该类的类。

要在控制器中使用此功能,请check the official docs,您只需要将依赖项添加到构造函数中,然后赢取!基本上是两个部分:

添加您的Startup.class

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddTransient<MySpecialClassWithDependencies>();
    ...
}

然后在您的控制器中:

public class HomeController : Controller
{
    private readonly MySpecialClassWithDependencies _mySpecialClassWithDependencies;

    public HomeController(MySpecialClassWithDependencies mySpecialClassWithDependencies)
    {
        _mySpecialClassWithDependencies = mySpecialClassWithDependencies;
    }

    public IActionResult Index()
    {
        // Now i can use my object here, the framework already initialized for me!
        return View();
    }