2013-05-10 40 views
9

我从一个实体对象填充一个网格,它显示数据正常。当我做出更改并将其保存后,没有任何更新。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; 

据表明它不能加载符号加载和本地:

enter image description here

+0

为什么要突出到具有与您的实体完全相同的属性的另一种类型? – 2013-05-10 22:00:02

+0

测试,我尝试了几个不同的想法,我结束了这一点。授予它不需要,但我离开了它。 – ErocM 2013-05-11 03:43:49

+0

should't'Load'是'Load()'? – 2013-05-21 06:11:33

回答

13

与WinForms和实体框架双向数据绑定可以通过从DbContextLocalObservableCollection<T>创建IBindinglist并将其设置为BindingSourceDataSource来实现。示例:

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; 
+0

对不起,我没有早点回来,我生病了。无论如何,它说无法解析符号加载或本地。我会将我的代码放在顶部以供您查看。 – ErocM 2013-05-15 13:58:57

+0

@ErocM什么版本的实体框架?以上内容适用于EF 4.1+,因为它使用'DbContext' API而不是旧的'ObjectContext' API。另外检查你是否参考'System.Data.Entity'。 – 2013-05-15 21:20:14

+0

v4.0.30319您在哪里以及如何获得4.1+?我正在使用.net 4.0完整版。 – ErocM 2013-05-15 21:29:11

4

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

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

1

您正在创建新的DataBindingProjection(),因此我们假设这是一个受上下文权限控制的类?

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

在调用SaveChanges()之前,您需要将创建的实体附加()到上下文,我没有在代码中看到它。

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

对我来说,你似乎有一个新的班级不被EF跟踪.....

如果你做了这样的事情,那么它应该工作(IM假设一个名为投影在你的实体的财产,只是一个例子):

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(); 

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

2

.Load().Local将可见使用时参考:

using System.Data.Entity;