none
Сохранение коллекции в базе данных RRS feed

  • Вопрос

  • Добрый день. Давно хотел задать такой вопрос.

    Есть  база данных. Когда я создаю модель edmx на основе этой базы. Создаётся класс

    Например так:

    public partial class IGE { public int IdIGE { get; set; } public Nullable<int> sortFilds { get; set; } public Nullable<int> objectID { get; set; } public Nullable<int> projectID { get; set; }

    ...


    и их куча,

    На основе этого класса я создаю коллекцию. Потом её заполняю каким то образом и встаёт вопрос о сохранении данных из коллекции в базу.

    Делаю как то так:

                    using (var db = new myproektEntities())
                    {
                        IGE prc = new IGE
                        {
                            sortFild = 1,
                            objectID = _obs[0].objectID,
                            projectID = _obs[0].projectID,
                           
                        };
                        db.IGE.Add(prc);
                        db.SaveChanges();
                    }

    Ну или редактирование то ищу строку по ID и сохраняю.

    Вопрос:

    Можно избежать такого кода на сохранение данных в базу

            IGE prc = new IGE
                        {
                            sortFild = 1,
                            objectID = _obs[0].objectID,
                            projectID = _obs[0].projectID,
                           
                        };

    Может как нибудь компилятор понимает, что коллекция на базе класса из самой базы. И что поля коллекции полностью соответствуют полям в базе. Зачем их приравнивать каждый раз. Может есть ситуации, если изменения какие понятно, необходимо приравнивать. Но в простом варианте может можно как -нибудь записать

    IGE prc = new _obs[0]
    Спасибо

    29 марта 2016 г. 10:28

Ответы

  • ну проверьте 

    db.IGE.Add(_obs[0]);


    Mak Arti

    • Помечено в качестве ответа DevingAs 29 марта 2016 г. 14:45
    29 марта 2016 г. 13:00
  • Добрый день.

    А кто вам мешает хранить объекты не в списке, а сразу в контексте? выбирая их от туда по мере надобности Linq?

    Если у вас приложение клиентское, то создайте один (ну или несколько) контекстов и пользуйтесь ими.

    • Помечено в качестве ответа DevingAs 29 марта 2016 г. 14:53
    29 марта 2016 г. 13:41
    Отвечающий
  • Насчет редактирование: Вы через контекст получаете объект IGE из базы, выполняя запрос SingleOfDefult, далее делаете изменения и вызываете метод контекста сохранение.

    var ige =  db.IGE.SingleOrDefault(a => a.IdIGE==12);

    if(ige != null)

    {
    ige.sortFild = 2;

    db.SaveChanges();

    }

    Правильно я вас понял что вы хотели знать?


    Mak Arti



    29 марта 2016 г. 14:23
  • Под контекстом я понимаю вот эту штуку:

    var db = new myproektEntities()
    • Помечено в качестве ответа DevingAs 29 марта 2016 г. 14:52
    29 марта 2016 г. 14:27
    Отвечающий

Все ответы

  • ну проверьте 

    db.IGE.Add(_obs[0]);


    Mak Arti

    • Помечено в качестве ответа DevingAs 29 марта 2016 г. 14:45
    29 марта 2016 г. 13:00
  • Добрый день.

    А кто вам мешает хранить объекты не в списке, а сразу в контексте? выбирая их от туда по мере надобности Linq?

    Если у вас приложение клиентское, то создайте один (ну или несколько) контекстов и пользуйтесь ими.

    • Помечено в качестве ответа DevingAs 29 марта 2016 г. 14:53
    29 марта 2016 г. 13:41
    Отвечающий
  • Добрый день.

    А кто вам мешает хранить объекты не в списке, а сразу в контексте? выбирая их от туда по мере надобности Linq?

    Это как? Контекст в данном случае это ведь не DataContext какого - нибудь Grid-а. Или всё таки это DataContext какого - нибудь Grid в UserControl при загрузке его туда помещаем. А потом? Всё равно нужно будет открывать подключение к базе и записывать данные через Linq? Или как то автоматически он запишется в базу из DataContext - а Grid - а.?
    29 марта 2016 г. 14:11
  • ну проверьте 

    db.IGE.Add(_obs[0]);


    Mak Arti

    А также но редактировать строку? Можно. Или это уже слишком было бы?

    Например как то так

     db.IGE.FirstOrDefault(a => a.IdIGE==12).... Тут как нибудь перезаписать строку выбранную.

    29 марта 2016 г. 14:16
  • Насчет редактирование: Вы через контекст получаете объект IGE из базы, выполняя запрос SingleOfDefult, далее делаете изменения и вызываете метод контекста сохранение.

    var ige =  db.IGE.SingleOrDefault(a => a.IdIGE==12);

    if(ige != null)

    {
    ige.sortFild = 2;

    db.SaveChanges();

    }

    Правильно я вас понял что вы хотели знать?


    Mak Arti



    29 марта 2016 г. 14:23
  • Под контекстом я понимаю вот эту штуку:

    var db = new myproektEntities()
    • Помечено в качестве ответа DevingAs 29 марта 2016 г. 14:52
    29 марта 2016 г. 14:27
    Отвечающий
  • Насчет редактирование: Вы через контекст получаете объект IGE из базы, выполняя запрос SingleOfDefult, далее делаете изменения и вызываете метод контекста сохранение.

    var ige =  db.IGE.SingleOrDefault(a => a.IdIGE==12);

    if(ige != null)

    {
    ige.sortFild = 2;

    db.SaveChanges();

    }

    Правильно я вас понял что вы хотели знать?


    Mak Arti



    Так я сейчас делаю. Т.е. каждое поле базы приравниваю к полю коллекции. Хотя коллекция создана на классе из базы данных. Вот с простым добавлением там где .Add(_obs[0]); Вот это видимо должно сработать. Т.е. одной строчкой я всю коллекцию запишу в базу. Про редактирование я тоже думал, что так можно. Ну например у меня в коллекции есть поле ID оно же в базе поле ID. И перезаписываются значения. Конечно они перезапишутся. Но вот как одной строчкой перезаписать строчки в базе.

    например как при добавлении

    db.IGE.Update(_obs[0]); Или как то так.Но Update такого нет метода.

    Ведь по сути коллекция создана из базы. Ну да ладно. Мне гораздо сильно поможет даже эта строчка. Раньше эта строчка у меня была строк под 300,

    db.IGE.Add(_obs[0]);

    29 марта 2016 г. 14:45
  • Под контекстом я понимаю вот эту штуку:

    var db = new myproektEntities()

    А потом? Т.е. вместо заключения этого кода в using(var db = new myproektEntities()) Можно просто создать переменную var db (на всё время работы UserControl -а)  в ней делать выборки и манипуляции, а потом в конце написать db.SaveChanges(); и всё будет сохранено в базе?

    Если это так. Супер!

    Только опять 40% кода переписывать. Ааааа. Надо было сначала учиться пойти на программиста, потом браться за дело :)

    29 марта 2016 г. 14:52
  • Почитайте эту статью, думаю вам будет интересно.

    https://habrahabr.ru/post/268627/


    Mak Arti

    29 марта 2016 г. 14:57
  • А потом? ... Только опять 40% кода переписывать.

    Не обязательно контекст на контрол, бывает хватает одного на ViewModel или даже все приложение. Все зависит от персистентности данных. Если есть данные которые живут все время работы приложения, то их контекст может жить тоже все время жизни приложения.
    Ааааа. Надо было сначала учиться пойти на программиста, потом браться за дело :)

    Вся прелесть работы программистом, что вам всю жизнь придется учиться :)
    30 марта 2016 г. 3:19
    Отвечающий