6

Tôi vừa tạo điều khiển người dùng. Điều khiển này cũng sử dụng lớp Khung thực thể tĩnh của tôi để tải hai combobox. Tất cả là tốt và chạy mà không có một vấn đề. Thiết kế và thời gian chạy đang hoạt động. Sau đó, khi tôi ngừng ứng dụng, tất cả các biểu mẫu chứa UserControl của tôi không hoạt động nữa trong thời gian thiết kế. Tôi chỉ thấy hai lỗi:EF trong một UserControl không thể nhìn thấy app.config?

Lỗi1: Kết nối được chỉ định có tên hoặc không được tìm thấy trong cấu hình, không có ý định được sử dụng với nhà cung cấp EntityClient hoặc không hợp lệ.

Lỗi 2: Biến số ccArtikelVelden không được khai báo hoặc chưa bao giờ được chỉ định. (ccArtikelVelde là tôi UserControl)

Runtime mọi thứ vẫn đang làm việc

tĩnh lớp EF Repositoy của tôi:

public class BSManagerData 
{ 
    private static BSManagerEntities _entities; 
    public static BSManagerEntities Entities 
    { 
     get 
     { 
      if (_entities == null) 
       _entities = new BSManagerEntities(); 
      return _entities; 
     } 
     set 
     { 
      _entities = value; 
     } 
    } 
} 

Một số luận lý xảy ra trong UserControl của tôi để tải các dữ liệu trong comboboxes:

private void LaadCbx() 
{ 
    cbxCategorie.DataSource = (from c in BSManagerData.Entities.Categories 
           select c).ToList(); 
    cbxCategorie.DisplayMember = "Naam"; 
    cbxCategorie.ValueMember = "Id"; 
} 

private void cbxCategorie_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    cbxFabrikant.DataSource = from f in BSManagerData.Entities.Fabrikants 
           where f.Categorie.Id == ((Categorie)cbxCategorie.SelectedItem).Id 
           select f; 
    cbxFabrikant.DisplayMember = "Naam"; 
    cbxFabrikant.ValueMember = "Id"; 
} 

Cách duy nhất để làm cho biểu mẫu của tôi hoạt động trở lại, thời gian thiết kế, là nhận xét phần EF trong UserControl (xem ở trên) và xây dựng lại. Nó rất lạ, mọi thứ đều nằm trong cùng một assembly, cùng một không gian tên (vì mục đích đơn giản).

Bất kỳ ai có ý tưởng?

+2

Tôi đã ngừng đọc ngay khi đọc từ "lớp Khuôn khổ thực thể tĩnh". Đừng làm thế nữa. Hiện nay. 'ObjectContext' không được thiết kế để sử dụng theo cách này. – Aaronaught

Trả lời

8

Có vẻ như bạn đang thực hiện mã cơ sở dữ liệu trong chế độ thiết kế bằng cách nào đó. Để ngăn chặn điều này, hãy truy cập vào điều khiển và phương pháp gây ra điều này và sử dụng:

if (DesignMode) 
    return 

Ngoài ra, bạn nên lưu cache trong bối cảnh cơ sở dữ liệu tĩnh. Nó sẽ gây ra vấn đề với đa luồng, và cũng có thể khi bạn đang thực hiện chèn và xóa. Ngữ cảnh cơ sở dữ liệu có nghĩa là được sử dụng cho một "đơn vị công việc" duy nhất, đang thêm 2 và xóa 3 đối tượng khác và gọi SaveChanges một lần.

+0

Cảm ơn bạn đã trả lời Tôi là tất cả để thực hành tốt nhất và nếu sử dụng lớp tĩnh là thực tế xấu tôi phải xem làm thế nào tôi nên làm điều đó theo một cách khác. Vấn đề là tôi đã có một lỗi một số thời gian trước đây, nơi tôi không thể chỉnh sửa một đối tượng từ ngữ cảnh khác. Tôi đọc trên StackOverflow mà tạo ra một lớp tĩnh là một trong những giải pháp. Đó là lý do tại sao tôi đã đi cho phương pháp này. Tôi cũng không phải là một fan hâm mộ lớn của mọi thời gian khi tôi cần phải truy cập vào DB, xây dựng một tuyên bố sử dụng xung quanh hoạt động của tôi. Tôi mới tham gia EF, vì vậy mọi lời khuyên xây dựng sẽ được chào đón nhiều hơn! – Sven

+0

Chỉ cần thử những gì bạn đề xuất nhưng vẫn không tốt. Bây giờ tôi đã làm như sau: riêng void LaadCbx() { if (DesignMode) return; cbxCategorie.DataSource = (từ c trong BSManagerData.Entities.Categories chọn c) .ToList(); cbxCategorie.DisplayMember = "Naam"; cbxCategorie.ValueMember = "Id"; } Tuy nhiên, khi tôi cố thêm điều khiển vào biểu mẫu của mình, tôi nhận được lỗi sau: http://img716.imageshack.us/img716/6549/eferror.png – Sven

+0

Bạn đang gọi LaadCbx() ở đâu? Trong trường hợp bạn đang gọi nó từ một hàm tạo, hãy cố gắng loại bỏ nó khỏi hàm tạo của điều khiển. Nó tốt hơn (không chỉ cho vấn đề này, nhưng nói chung) để làm càng ít càng tốt trong các nhà xây dựng, đặc biệt là không kết nối DB. Bạn sẽ có thể sử dụng một cái móc như OnLoad để tải dữ liệu thay vào đó. –

2

tôi phải đối mặt với cùng một vấn đề,

Trong trường hợp của tôi, tôi đã thêm một số mã cơ sở dữ liệu trong trường hợp tải điều khiển người dùng mà đang sử dụng một số thư viện, mà không được nạp cho đến khi thời gian chạy.

Do đó, bạn nên viết mã cơ sở dữ liệu trong sự kiện tải kiểm soát của người dùng.

Hy vọng, điều này sẽ giúp bạn!

+0

Cảm ơn bạn! Tôi vừa dành 3 giờ, cố gắng hiểu, những gì tôi đang làm sai. Tôi đã cố gắng tạo lại mô hình thực thể, tạo ra một vài giải pháp thử nghiệm ... Và câu trả lời rất đơn giản: KHÔNG VIẾT MÃ XÁC NHẬN TRONG MÃ SỰ KIỆN ĐIỀU KHIỂN NGƯỜI DÙNG! –

0

lỗi này hiển thị nếu bạn gọi hàm "LaadCbx()" trên hàm tạo của userControl.

vì việc khởi tạo khung thực thể tồn tại trong hàm này.

giải pháp là gọi hàm này "LaadCbx()" trong hàm tạo của biểu mẫu gốc.

Các vấn đề liên quan