привязка 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:
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 не работает-сущность остается неизменной.
при обновлении свойства экземпляра проекции необходимо либо привязать сами сущности как источник данных к сетке, либо обновить свойство соответствующей сущности.
вы создаете новый 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