Как обновить базу данных с помощью LINQ to SQL?

1

Я новичок в использовании LINQ. Я знаю, что на эту тему много разных постов, но большинство из них старше и не работают для моей ситуации (или я делаю что-то еще неправильно).

У меня есть форма, которая при загрузке создает контекст данных. У меня есть вторичная форма, где пользователь может выбрать путь, и этот путь обновляется в таблице конфигурации, которая имеет одну строку.

Это определение класса конфигурации...

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Configuration")]
public partial class Configuration : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _Id;

    private string _LegalRepository;

    private string _TitleRepository;

    private bool _AlwaysOpenOnDesktop;

#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnIdChanging(int value);
partial void OnIdChanged();
partial void OnLegalRepositoryChanging(string value);
partial void OnLegalRepositoryChanged();
partial void OnTitleRepositoryChanging(string value);
partial void OnTitleRepositoryChanged();
partial void OnAlwaysOpenOnDesktopChanging(bool value);
partial void OnAlwaysOpenOnDesktopChanged();
#endregion

    public Configuration()
    {
        OnCreated();
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
    public int Id
    {
        get
        {
            return this._Id;
        }
        set
        {
            if ((this._Id != value))
            {
                this.OnIdChanging(value);
                this.SendPropertyChanging();
                this._Id = value;
                this.SendPropertyChanged("Id");
                this.OnIdChanged();
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_LegalRepository", DbType="NVarChar(100) NOT NULL", CanBeNull=false)]
    public string LegalRepository
    {
        get
        {
            return this._LegalRepository;
        }
        set
        {
            if ((this._LegalRepository != value))
            {
                this.OnLegalRepositoryChanging(value);
                this.SendPropertyChanging();
                this._LegalRepository = value;
                this.SendPropertyChanged("LegalRepository");
                this.OnLegalRepositoryChanged();
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TitleRepository", DbType="NVarChar(100) NOT NULL", CanBeNull=false)]
    public string TitleRepository
    {
        get
        {
            return this._TitleRepository;
        }
        set
        {
            if ((this._TitleRepository != value))
            {
                this.OnTitleRepositoryChanging(value);
                this.SendPropertyChanging();
                this._TitleRepository = value;
                this.SendPropertyChanged("TitleRepository");
                this.OnTitleRepositoryChanged();
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_AlwaysOpenOnDesktop", DbType="Bit NOT NULL")]
    public bool AlwaysOpenOnDesktop
    {
        get
        {
            return this._AlwaysOpenOnDesktop;
        }
        set
        {
            if ((this._AlwaysOpenOnDesktop != value))
            {
                this.OnAlwaysOpenOnDesktopChanging(value);
                this.SendPropertyChanging();
                this._AlwaysOpenOnDesktop = value;
                this.SendPropertyChanged("AlwaysOpenOnDesktop");
                this.OnAlwaysOpenOnDesktopChanged();
            }
        }
    }

Создание контекста базы данных...

public partial class fmFileSearch : Form
{
    public Configuration configuration = new Configuration();

    public FileSearchDataContext fileSearchDB = new FileSearchDataContext();

    public fmFileSearch()
    {
        InitializeComponent();

        this.WindowState = FormWindowState.Maximized;

        ReadConfiguration();
    }

Я могу читать строки...

configuration = (from c in fileSearchDB.Configurations where c.Id == 1 select c).SingleOrDefault();

Но когда я пытаюсь обновить строку, она не обновляется...

configuration.TitleRepository = locateRepository.SelectedPath;

fileSearchDB.SubmitChanges();

В таблице есть первичный ключ, и когда я смотрю на объект конфигурации в хранилище, он имеет новое значение.

Почему обновление базы данных не будет?

ОБНОВЛЕНО: я добавил код, чтобы показать, как создается контекст базы данных по конструктору для класса, где я вызываю процедуру для чтения строки.

ОБНОВЛЕНИЕ 2: Если я прочитал строку таким образом, это сработает...

var query =
    from c in fileSearchDB.Configurations
        where c.Id == 1
        select c;

    foreach (Configuration c in query)
    {
        configuration = c;
    }

Зачем??

  • 1
    что такое locateRepository?
  • 1
    Я отредактировал ваш заголовок. Пожалуйста, смотрите: « Должны ли вопросы включать« теги »в их заголовки? », Где консенсус «нет, они не должны».
Показать ещё 2 комментария
Теги:
linq
linq-to-sql

1 ответ

0

Убедитесь, что fileSearchDB в этой строке

configuration = (from c in fileSearchDB.Configurations where c.Id == 1 select c).SingleOrDefault();

на самом деле тот же контекст db в этом

fileSearchDB.SubmitChanges();

потому что может быть, что в первой строке есть один контекст db, а во второй строке - другой контекст db.

убедитесь, что они используют один и тот же контекст db, попробуйте сделать следующее:

using(var fileSearchDb = new MyFileSearchDbContext())
{
    var configuration = (from c in fileSearchDB.Configurations where c.Id == 1 select c).SingleOrDefault();
    configuration.TitleRepository = locateRepository.SelectedPath;
    fileSearchDB.SubmitChanges();

}
  • 0
    Процедура, в которой я читаю конфигурацию, отличается от той, в которой я ее обновляю. Нужно ли мне читать и обновлять в той же рутине?
  • 0
    Вы должны прочитать и обновить до того же «fileSearchDb»
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню