1

ユーザーの画面設定を保存できるように、プログラムの開始時に取得し、プログラムの終了時に保存する ScreenSettings エンティティがあります。

このため、コンテキストを開いたままにしたくありません。

これを行う最善の方法について疑問に思っています。私は次のことを試しましたが、オブジェクトを削除して再度追加するため、SaveSettings 関数に慣れていません。

オブジェクトを実際に置き換えずに変更を保存するにはどうすればよいですか?

namespace ClassLibrary1
{
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

//Domain Class
public class ScreenSetting
{
    #region Properties

    public int Id { get; set; }

    [Required]
    public int WindowLeft { get; set; }

    [Required]
    public int WindowTop { get; set; }

    #endregion
}

// Context
public class Context : DbContext
{
    #region Properties

    public DbSet<ScreenSetting> ScreenSettings { get; set; }

    #endregion
}

// UI
public class UI
{
    #region Public Methods

    // Get the settings object
    public ScreenSetting GetSettings(int SettingsId)
    {
        var Db = new Context();
        ScreenSetting settings = Db.ScreenSettings.Find(SettingsId);
        if (settings == null)
        {
            settings = new ScreenSetting { Id = SettingsId, WindowTop = 100, WindowLeft = 100 };
            Db.ScreenSettings.Add(settings);
        }
        Db.Dispose();
        return settings;
    }

    // Save the settings object
    public void SaveSettings(ScreenSetting settings)
    {
        var Db = new Context();
        ScreenSetting oldSettings = Db.ScreenSettings.Find(settings.Id);
        if (oldSettings == null)
        {
            Db.ScreenSettings.Add(settings);
        }
        else
        {
            Db.ScreenSettings.Remove(oldSettings);
            Db.ScreenSettings.Add(settings);
        }
        Db.Dispose();
    }

    public void test()
    {
        ScreenSetting setting = this.GetSettings(1);
        setting.WindowLeft = 500;
        setting.WindowTop = 500;
        this.SaveSettings(setting);
    }

    #endregion

    #region Methods

    private static void Main()

    {
        var o = new UI();
        o.test();
    }

    #endregion
}
}
4

1 に答える 1

2

update または insert という一般的なパターンに遭遇しました。これは非常に一般的であるため、 upsertという名前が付けられています。パターンが共通する場合、通常、共通のソリューションも存在します。

には、まさにあなたが望むことをSystem.Data.Entity.Migrations行う拡張メソッドがあります:AddOrUpdate

public void SaveSettings(ScreenSetting settings)
{
    using (var db = new Context())
    {
        db.ScreenSettings.AddOrUpdate(settings);
        db.SaveChanges();
    }
}
于 2013-02-09T12:28:38.750 に答える