首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >DbContext未更新数据库

DbContext未更新数据库
EN

Stack Overflow用户
提问于 2019-05-29 05:36:27
回答 1查看 627关注 0票数 0

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

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

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

    public static class RoadmapService
    {
        static ConkerDbEntities dbContext;
        public static void createDbContext(ConkerDbEntities _dbContext)
        {
            dbContext = _dbContext;
        }

        public static void 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();
        }
    }
}

在创建dbcontext的位置,这是Startup.cs的构造函数

        public static SearchEngine engine;
        public static ConkerDbEntities dbContext;

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;

            dbContext = new ConkerDbEntities();

            RoadmapService.createDbContext(dbContext);
            engine = new SearchEngine(dbContext);

        }

我没有得到任何错误,也没有向数据库中添加任何内容。我可能在这里做了一些根本错误的事情。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-29 05:39:08

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

如果您有异步方法,请使用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在这种情况下会提供性能上的优势吗?

它更多的是关于代码的可读性和可维护性,在答案中我已经放了一个链接到一个帖子,那里有更好的解释,你在你的代码中创建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对象传递给

构造函数,这是我从来没有见过的。

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

这也是一个重要的主题,你应该检查我之前的microsoft文档链接,但基本上,你所要做的就是将类定义为依赖关系,所以,当你请求一个依赖关系时,系统本身会检查依赖关系,以及该对象的依赖关系,直到解析出所有依赖关系树。

这样,如果您的类中需要更多的依赖项,您可以直接添加,但不需要修改使用该类的所有类。

要在控制器中使用它,请check the official docs,你只需要将你的依赖项添加到构造函数中,然后win!,基本上是两部分:

添加到您的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();
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56350348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档