привязка datagridview к сущности, не обновляющей базу данных

я заполняю сетку из объекта сущности, и она отображает данные в порядке. Когда я делаю изменения и сохраняю его обратно, ничего не обновляется.

вот мой код:

в моем случае нагрузка:

  var query = from c in _entities.PaymentTypes
              where c.CorporationId == _currentcorp.CorporationId
              select
                new DataBindingProjection
                  {
                    PaymentTypeId = c.PaymentTypeId,
                    CorporationId = c.CorporationId,
                    TokenId = c.TokenId,
                    IsActive = c.IsActive,
                    Description = c.Description,
                    CashChargeCodeType = c.CashChargeCodeType,
                    SortOrder = c.SortOrder,
                    ExcludeCreditCode = c.ExcludeCreditCodes,
                    IsUpdated = c.IsUpdated,
                    IsAdded = c.IsAdded,
                    ClearUpdatedAndAdded = c.ClearUpdateAndAdded
                  };
  dataGridView_PaymentTypes.DataSource = query.ToList();

мой класс:

private class DataBindingProjection
{
  public Guid PaymentTypeId { get; set; }
  public Guid CorporationId { get; set; }
  public Guid TokenId { get; set; }
  public bool IsActive { get; set; }
  public string Description { get; set; }
  public int CashChargeCodeType { get; set; }
  public int SortOrder { get; set; }
  public int ExcludeCreditCode { get; set; }
  public bool IsUpdated { get; set; }
  public bool IsAdded { get; set; }
  public bool ClearUpdatedAndAdded { get; set; }
}

в кнопке для сохранения изменений:

private void button_SaveChanges2_Click(object sender, EventArgs e)
{
  button_SaveChanges2.Enabled = false;
  _entities.SaveChanges();
  timer1.Enabled = true;
  button_SaveChanges2.Enabled = true;
}

что я делаю не так?

в ответ на bmused:

определено в классе уровень:

private SuburbanPortalEntities _entities;

определено в моей нагрузке:

  var bs = new BindingSource();
  _entities.PaymentTypes.Where(x => x.CorporationId == _currentcorp.CorporationId).Load;
  bs.DataSource = _entities.PaymentTypes.Local.ToBindingList();
  dataGridView_PaymentTypes.DataSource = bs;

он показывает, что он не может загрузить символ Load и Local:

enter image description here

5 ответов


двусторонняя привязка данных с Winforms и Entity Framework может быть достигнута путем создания IBindinglist С DbContext Local ObservableCollection<T> и установка его как DataSource of a BindingSource. Пример:

private BindingSource bs = new BindingSource();
private MyDbContext context = new MyDbContext();

context.MyEntities.Where(x=>x.SomeProperty == 2).Load(); 
bs.DataSource = context.MyEntities.Local.ToBindingList(); 
myDataGridView.DataSource = bs;

вы изменяете свойства проецируемой копии сущности, в то время как сама сущность остается неизменной. Вот почему save не работает-сущность остается неизменной.

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


.Load() и .Local будет видно при использовании ссылки:

 using System.Data.Entity;

вы создаете новый DataBindingProjection (), поэтому мы предполагаем, что это класс, который управляется вашим контекстом правильно?

предполагая, что то, что я вижу, что отсутствует в вашем коде, - это передача нового экземпляра DataBindingProjection в ваш DbContext (если используется 4.2+ или ObjectContext при использовании более старых версий, я бы рекомендовал перейти на 5.0)

вам нужно прикрепить() созданные сущности к контексту перед вызовом SaveChanges (), i не вижу этого в коде.

это способ создания новых записей в базе данных. Если вы хотите изменить записи, которые находятся в базе данных, вы не должны использовать подход Linq, где вы создаете новый объект, вы должны вызвать сам объект, чтобы он мог иметь прокси EF и отслеживаться ChangeTracker EF.

для меня кажется, что у вас есть новый класс, который не отслеживается EF.....

Если вы сделали что-то подобное, то это должно сработать (я предполагаю, что свойство с именем Projection находится в ваших сущностях, только для примера):

var query = from c in _entities.PaymentTypes
         where c.CorporationId == _currentcorp.CorporationId 
         select c.Projection;

dataGridView_PaymentTypes.DataSource = query.ToList();

Если у вас этого нет, то вы должны сделать что-то вроде этого:

var query = from c in _entities.PaymentTypes
         where c.CorporationId == _currentcorp.CorporationId 
         new DataBindingProjection
              {
                PaymentTypeId = c.PaymentTypeId,
                CorporationId = c.CorporationId,
                TokenId = c.TokenId,
                IsActive = c.IsActive,
                Description = c.Description,
                CashChargeCodeType = c.CashChargeCodeType,
                SortOrder = c.SortOrder,
                ExcludeCreditCode = c.ExcludeCreditCodes,
                IsUpdated = c.IsUpdated,
                IsAdded = c.IsAdded,
                ClearUpdatedAndAdded = c.ClearUpdateAndAdded
              };

foreach(var item in query)
    (DbContext)YourInstanceOfContext.Set<DataBindingProjection>().Add(item);

dataGridView_PaymentTypes.DataSource = query.ToList();

после этого вы сможете сохранить его в базе данных.


взгляните на мой пост о привязке datagridView, метод работает очень хорошо и его очень полезно:лучший подход для привязки datagridview к сущности базы данных / ies