9

我正在从一个实体对象填充一个网格,它可以很好地显示数据。当我进行更改并将其保存回来时,没有任何更新。

这是我的代码:

在我的加载事件中:

  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:

在此处输入图像描述

4

5 回答 5

14

IBindinglist可以通过创建fromDbContext Local ObservableCollection<T>并将其设置为DataSourcea来实现与 Winforms 和 Entity Framework 的双向数据绑定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;
于 2013-05-10T22:11:50.580 回答
4

您正在更改实体的投影副本的属性,而实体本身保持不变。这就是保存不起作用的原因 - 实体保持不变。

您需要将实体本身作为 DataSource 绑定到网格,或者在更新投影实例的属性时更新相应实体的属性。

于 2013-05-19T03:49:11.447 回答
2

.Load()并且.Local在使用参考时可见:

 using System.Data.Entity;
于 2013-11-01T22:59:22.053 回答
1

您正在创建新的 DataBindingProjection() 所以我们假设这是一个由您的上下文控制的类,对吧?

假设,我看到您的代码中缺少的是让您将 DataBindingProjection 的新实例传递给您的 DbContext(如果使用 4.2+ 或 ObjectContext,如果使用旧版本,我建议迁移到 5.0)

在调用 SaveChanges() 之前,您需要将创建的实体 Attach() 到上下文中,我在您的代码中看不到这一点。

这是您在数据库中创建新记录的方式。如果要更改数据库中的记录,则不应使用创建新对象的 Linq 方法,而应调用对象本身,以便它可以具有 EF 代理并由 EF 的 ChangeTracker 跟踪。

对我来说,您似乎有一个不受 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();

在此之后,您将能够将其保存到数据库中。

于 2013-05-21T06:26:10.580 回答
0

看看我关于绑定 datagridView 的帖子,该方法效果很好并且很有帮助:Best approach to bind a datagridview to database entity/ies

于 2014-01-15T06:56:55.993 回答