Entity framework 当控制器第一次运行时,如何运行方法?

Entity framework 当控制器第一次运行时,如何运行方法?,entity-framework,asp.net-core,.net-core,Entity Framework,Asp.net Core,.net Core,我的项目正在运行一个内存数据库和一个以实体框架为核心的关系数据库 当控制器第一次运行时,我需要将一些数据从关系数据库复制到内存数据库中 现在我这样做: public class TestController : Controller { public TestController() { if (IMemoryCache.Get("DatabaseInitialised") == null)

我的项目正在运行一个内存数据库和一个以实体框架为核心的关系数据库

当控制器第一次运行时,我需要将一些数据从关系数据库复制到内存数据库中

现在我这样做:

public class TestController : Controller
    {       
        public TestController()
        {           
            if (IMemoryCache.Get("DatabaseInitialised") == null)
            {               
                IMemoryCache.Set("DatabaseInitialised", true);
                ///Some code to copy the data
            }
        }
}
我使用
IMemoryCache
记录数据是否已被复制

嗯,有时它只运行一次,有时它仍将运行两次或更多


有没有更好的方法来实现这一点?谢谢。

为了满足您的需要,我建议您使用后台服务,它可以在启动时触发,而不是在控制器中触发。然后您将确保它只运行一次。如果服务注册为单例,您可以在其上设置一个标志,并从控制器中进行检查

public class DatabasePopulationService
{
    public bool IsDatabaseReady { get; private set; }

    public void PopulateInMemoryDatabase()
    {
       //populate in memory db
       IsDatabaseReady  = true;
    }
}

 public class TestController : Controller
 {
      public TestController(DatabasePopulationService svc)
      {
           if (svc.IsDatabaseReady) //do something
           else //do something else
      }
 }

您的代码运行多次,因为您的if在线程之间不同步。使用IMemoryCache存储简单的标志对我来说也没有意义。我建议您创建一个单独的服务来执行数据的复制,其中包含线程同步,并将其作为一个单例注入控制器中。您还可以显示调用
PopulateInMemoryDatabase()的方式/位置/时间吗
应该进行吗?可以通过实现使DatabasePopulationService实现IHostedService,然后在net core上使用AddHostedService扩展方法进行注册来实现。