首先使用代码保存和恢复断开连接的实体的正确方法是什么?

时间:2013-02-09 10:46:55

标签: winforms entity-framework-5

为了能够存储用户的屏幕首选项,我在程序启动时要检索的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
}
}

1 个答案:

答案 0 :(得分:2)

你遇到了一个常见的模式,更新或插入,这是很常见的,它有一个名字: upsert 。当模式很常见时,通常也会有一个共同的解决方案。

System.Data.Entity.Migrations中,有一种扩展方法AddOrUpdate可以完全符合您的要求:

public void SaveSettings(ScreenSetting settings)
{
    using (var db = new Context())
    {
        db.ScreenSettings.AddOrUpdate(settings);
        db.SaveChanges();
    }
}