2

私のアプリケーションでは、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 秒など)。最初に保存した後、うまく機能しています(1秒未満)。だから私の質問は - どうすれば最初の保存を改善できるので、保存が速くなりますか?

4

1 に答える 1

3

usingまず、コンテキストをブロックに入れる必要があります

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

        //...

         context.SaveChanges();
    }
}

そうしないと、完了時に接続が接続プールに解放されず、プログラムの実行時にパフォーマンスの問題が発生する可能性があります。

実際の問題について:Entity Frameworkは、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());
}
于 2013-08-21T07:59:57.323 に答える