Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存到数据库花费的时间太长_C#_Database_Entity Framework - Fatal编程技术网

C# 保存到数据库花费的时间太长

C# 保存到数据库花费的时间太长,c#,database,entity-framework,C#,Database,Entity Framework,在我的应用程序中,我创建了一个userControl,然后我需要将它保存到数据库中。这是我的方法,我正在保存我的userControl: private void SaveControl(byte userControlType, ISelectableViewModel viewModel, Guid guid) { var context = new EntitiesNew(); var instrumentSettings = new INSTRUMENTSETTINGS

在我的应用程序中,我创建了一个userControl,然后我需要将它保存到数据库中。这是我的方法,我正在保存我的userControl:

private void SaveControl(byte userControlType, ISelectableViewModel viewModel, Guid guid)
{
    var context = new EntitiesNew();

    var instrumentSettings = new INSTRUMENTSETTINGS
                               {
                                   USERCONTROL = userControlType,
                                   INSTRUMENTHEIGHT = (float)viewModel.InstrumentHeight,
                                   INSTRUMENTWIDTH = (float)viewModel.InstrumentWidth,
                                   INSTRUMENTSCALABLEVALUE = viewModel.ScalableValue,
                                   INSTRUMENTPOSTOLEFT = (float)viewModel.InstrumentPosToLeft,
                                   INSTRUMENTPOSTOTOP = (float)viewModel.InstrumentPosToTop,
                                   INSTRUMENTZINDEX = viewModel.ZIndex,
                                   CREATED_BY= guid
                               };

    context.INSTRUMENTSETTINGSs.Add(instrumentSettings);
    context.SaveChanges();

    viewModel.ControlId = instrumentSettings.INSTRUMENTSETTINGSID;

    var roomId = (from room in context.ROOMs 
                 where room.ROOMNAME == viewModel.RoomName
                 select room.ROOMID).FirstOrDefault();

    var roomWithInstrument = new ROOMWITHINSTRUMENT
                         {
                             CREATED_BY = guid,
                             INSTRUMENTSETTINGSID = viewModel.ControlId,
                             ROOMID = roomId
                         };

    context.ROOMWITHINSTRUMENTs.Add(roomWithInstrument);
    context.SaveChanges();
}

没有错误,它正在工作。唯一的问题是,当我第一次将记录保存到数据库时,花费的时间太长(比如2秒)。在第一次保存后,它工作得更好(少于一秒钟)。所以我的问题是-如何改进首次保存,使其更快地保存?

首先,您应该使用块将上下文放入

private void SaveControl(byte userControlType, ISelectableViewModel viewModel, Guid guid)
{
    using(var context = new EntitiesNew())
    {
        var instrumentSettings = //...

        //...

         context.SaveChanges();
    }
}
如果不这样做,则在完成时不会将连接释放回连接池,并且在程序运行时可能会导致性能问题

关于您的实际问题:实体框架在每个AppDomain第一次连接到数据库时会做很多额外的“工作”。您在调用第一个查询时就看到它发生了,但是您可以让它更快发生

public static void InitializeDatabaseConnection()
{
    using(var context = new EntitiesNew())
    {
        context.Database.Initialize(false);
    }
}
该方法将初始化当前AppDomain的连接,并允许第一次查询更快。我会在程序开始时在任务中运行这个方法

public static void Main(string[] args)
{
    //Assumes you put the function inside the EntitiesNew class
    Task.Run(() => EntitiesNew.InitializeDatabaseConnection()); 

    Application.Run(new Form1());
}

您是每次还是一次连接到数据库?您使用的是哪个数据库提供程序?显然不是最好的建议,在加载应用程序时,对数据库写入一些无关紧要的更改:)数据库的第一次查询也需要2秒钟吗?这是在发布版本中,还是在visual studio的调试模式下运行?当在VS中从调试模式运行时,由于正在加载调试符号,所以需要花费较长的时间。@iabbott:每次需要保存userControl时,我都会连接到数据库。我们正在使用SQL数据库服务器