2013-05-10 31 views
9

Tôi đang điền một lưới từ một đối tượng thực thể và nó đang hiển thị dữ liệu tốt. Khi tôi thực hiện thay đổi và lưu lại, không có gì đang cập nhật.datagridview ràng buộc với thực thể không cập nhật cơ sở dữ liệu

Đây là mã của tôi:

Trong trường hợp tải của tôi:

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

lớp của tôi:

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; } 
} 

Trong nút để lưu các thay đổi:

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

Tôi đang làm gì sai?

Để đối phó với bmused:

Defined ở cấp lớp:

private SuburbanPortalEntities _entities; 

quy định tại tải của tôi:

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

Nó cho thấy rằng nó không thể tải biểu tượng Load và Địa phương:

enter image description here

+0

Tại sao các bạn chiếu sang loại khác có các thuộc tính giống hệt nhau của pháp nhân của bạn? –

+0

thử nghiệm, tôi đã thử một số ý tưởng khác nhau và tôi đã kết thúc với điều này. Cấp nó không cần thiết nhưng tôi đã bỏ nó. – ErocM

+0

should't 'Load' là' Load() '? –

Trả lời

13

hai chiều databinding với Winforms và Entity Framework có thể đạt được bằng cách tạo ra một IBindinglist từ DbContextLocalObservableCollection<T> và thiết lập nó như là DataSource của một BindingSource. Ví dụ:

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

Xin lỗi tôi đã không quay lại sớm hơn, tôi đã bị bệnh. Nhưng dù sao, nó nói không thể giải quyết biểu tượng Load hoặc Local. Tôi sẽ đăng mã của tôi lên hàng đầu để bạn xem xét. – ErocM

+0

@ErocM phiên bản Entity Framework nào? Ở trên nên làm việc cho EF 4.1+ vì nó sử dụng API 'DbContext' không phải là API' ObjectContext' cũ. Đồng thời kiểm tra xem bạn có tham chiếu 'System.Data.Entity' hay không. –

+0

v4.0.30319 vị trí và cách bạn nhận 4.1+? Tôi đang sử dụng .net 4.0 đầy đủ. – ErocM

4

Bạn đang thay đổi các thuộc tính của bản sao dự án của thực thể, trong khi thực thể không thay đổi. Đó là lý do tại sao lưu không hoạt động - thực thể không thay đổi.

Bạn cần các thực thể liên kết chính nó dưới dạng DataSource để lưới hoặc cập nhật thuộc tính của thực thể tương ứng khi bạn cập nhật thuộc tính của thể hiện dự kiến.

1

Bạn đang tạo DataBindingProjection mới() vì vậy chúng tôi giả sử đây là lớp được kiểm soát bởi ngữ cảnh của bạn đúng không?

Giả sử rằng, những gì tôi thấy thiếu trong mã của bạn là để bạn chuyển thể hiện mới của DataBindingProjection sang DbContext của bạn (nếu sử dụng 4.2+ hoặc ObjectContext nếu sử dụng phiên bản cũ hơn, tôi khuyên bạn nên di chuyển sang 5.0)

Bạn cần phải đính kèm() các thực thể đã tạo vào ngữ cảnh trước khi gọi SaveChanges(), tôi không thấy điều này trong mã của bạn.

Đây là cách để bạn tạo bản ghi mới vào cơ sở dữ liệu. Nếu bạn muốn thay đổi các bản ghi ở cơ sở dữ liệu, bạn không nên sử dụng phương pháp Linq nơi bạn tạo một đối tượng mới, bạn nên gọi đối tượng đó, vì vậy nó có thể có các proxy EF và được theo dõi bởi ChangeTracker của EF.

Đối với tôi, có vẻ như bạn có một lớp học mới không được EF theo dõi .....

Nếu bạn làm điều gì như thế này, sau đó nó nên làm việc (im giả định một tài sản mang tên chiếu để được vào đơn vị của bạn, chỉ cần cho một ví dụ):

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

dataGridView_PaymentTypes.DataSource = query.ToList(); 

Nếu bạn không có điều đó thì bạn nên làm một cái gì đó như thế này:

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

Sau này, bạn sẽ có thể lưu nó vào cơ sở dữ liệu.

2

.Load().Local sẽ được hiển thị khi sử dụng tài liệu tham khảo:

using System.Data.Entity; 
Các vấn đề liên quan