приемлема ли эта функция сохранения LINQ? (чтобы иметь такую ​​общую логику INSERT/UPDATE?)

Я новичок в WPF и действительно борюсь с "правильным способом" делать что-то...

public void Save(CompanyContact entityToSave)
{
  try
  {

    var saveEntity = (from cc in db.CompanyContacts
        where cc.CompanyContactId == entityToSave.CompanyContactId
        select cc).SingleOrDefault();

    if (saveEntity == null)
    {
      //INSERT logic                    
      entityToSave.CreatedById = new CompanyPersonRepository().GetCompanyPerson(DataContext.Default.LoginUsername).CompanyPersonId;
      entityToSave.ModifiedById = entityToSave.CreatedById;

      db.CompanyContacts.InsertOnSubmit(entityToSave);
      db.CompanyContacts.Context.SubmitChanges();
    }
    else
    {
      //UPDATE logic            
      saveEntity.ModifiedById = new CompanyPersonRepository().GetCompanyPerson(DataContext.Default.LoginUsername).CompanyPersonId;
      saveEntity.CompanyId = entityToSave.Company.CompanyId;
      saveEntity.FirstName = entityToSave.FirstName;
      saveEntity.LastName = entityToSave.LastName;
      saveEntity.CompanyContactTypeId = entityToSave.CompanyContactTypeId;

      db.CompanyContacts.Context.SubmitChanges();

    }

...

если нет, не могли бы вы предоставить некоторые комментарии о том, почему это не так, или привести пример лучшего способа написания функций LINQ, если я не на правильном пути ??


person Skyguard    schedule 22.02.2010    source источник


Ответы (1)


Это сработает; вы также можете сохранить запись в форме как переменную, и если она равна нулю, запись не существует, но если она существует, необходимо выполнить обновление. Таким образом, вы можете свести к минимуму количество запросов и просто присвоить значения формы одному объекту, а не работать с двумя.

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

ХТН.

person Brian Mains    schedule 22.02.2010
comment
Спасибо за комментарии ... Я все еще новичок в этом, поэтому надеюсь, что вы можете пролить свет на некоторые вопросы для меня: Что вы делаете, если есть нарушение правила базы данных? Я обнаружил проблему, когда ОТВЕЧАЛ на свой ВОПРОС, размещенный здесь: -changes" title="проблема привязки wpf уникальное нарушение ограничения при обновлении, как отклонить изменения"> stackoverflow.com/questions/2300159/ Есть ли значение параметра, которое я могу предоставить LINQ, поэтому мне не нужно ловить SqlException и обновить коллекцию объектов, если правило базы данных нарушено... кажется глупым, что мне нужно написать код для обнаружения и обработки нарушений правил базы данных... - person Skyguard; 24.02.2010
comment
Эй, хорошо, что я сделал в прошлом, так это то, что каждый столбец LINQ имеет определение [Column()] (типа ColumnAttribute), которое вы можете использовать для отражения полей и проверки таких вещей, как длина, тип, допустимость значений NULL и т. д. .. если вы не хотите идти по этому пути, вы можете настроить свою собственную проверку, прежде чем сохранять и отмечать пользователей этих ошибок. Кроме этого, да, вы должны поймать исключение. Что я делаю, так это создаю контекст исключительно для этого запроса, пытаюсь сохранить, если возникает ошибка, уведомляю пользователя и позволяю этому контексту умереть. - person Brian Mains; 24.02.2010
comment
Продолжая... таким образом, когда они снова пойдут на сохранение, вы просто реконструируете объекты и работаете с того места, на котором остановились. В конце концов, форма все еще содержит базовые данные. - person Brian Mains; 24.02.2010