2015-07-21 17 views
14

Đây là câu hỏi "Tại sao chúng ta làm việc" vì vấn đề thực sự của tôi đã được giải quyết nhưng tôi không biết tại sao.Tại sao tôi phải có một hàm tạo tham số cho Code First/Entity Framework

tôi đã đối phó với đoạn mã sau bên CountyRepository tôi:

public IEnumerable<County> GetCounties(string stateAbbr) 
    { 
     using (var db = new AppDbContext()) 
     { 
      State state = (from s in db.States 
         where s.Abbr == stateAbbr 
         select s).First(); 

      return context.Counties.Where(c => c.StateID == state.StateID).ToList(); 
     } 
    } 

Các AppDbContext Tôi tạo ra ở trên sẽ đi đến một Initializer tùy chỉnh:

public class AppDbContextInitializer : DropCreateDatabaseIfModelChanges<AppDbContext> 
{ 
    protected override void Seed(AppDbContext context) 
    { 
     StatesList states = new StatesList(); 
     context.States.AddRange(states); 
     context.Counties.AddRange(new CountiesList(states)); 

     context.SaveChanges(); 
    } 
} 

Vấn đề là, khi tôi thực hiện mã AppDbContext sẽ tải thông tin Tiểu bang và Hạt một cách chính xác trong Trình khởi tạo, nhưng khi nó trở lại vào Kho lưu trữ Hạt, AppDbContext trống và sẽ bị lỗi do "Nhà nước không có hàm tạo tham số". Tôi không muốn đối tượng nhà nước của tôi có một nhà xây dựng không có tham số vì vậy tôi đã xem xét cả ngày để có giải pháp tại sao AppDbContext sẽ tải trong kho lưu trữ County. Cuối cùng tôi đã tìm thấy các giải pháp sau đây:

Exception when loading related objects. Entity Framework

Đó là một giải pháp đơn giản. Thêm constructor parameterless và đánh dấu nó là Obsolete. Tôi đã làm điều này và nó hoạt động hoàn hảo.

Câu hỏi của tôi là, TẠI SAO tôi phải làm điều này? Tôi đã đi qua nhiều ví dụ của CodeFirst bằng cách sử dụng tùy chỉnh Initializer và không ai trong số họ đã đề cập yêu cầu một constructor rỗng hoặc đánh dấu nó Obsolete.

Có giải pháp nào tốt hơn hay ít nhất là giải thích để tôi có thể tiếp tục với kiến ​​thức thay vì nhầm lẫn?

+0

nếu lớp trạng thái của bạn có hàm tạo tùy chỉnh, thì bạn cũng phải cung cấp một hàm tạo khác (không tham số). tại sao? quy tắc của .net. – BKSpurgeon

+1

@BKSpurgeon Vâng, điều đó không hoàn toàn chính xác. Nếu bạn không có một hàm tạo được định nghĩa, thì hàm tạo ngầm mặc định (parameterless) tồn tại. Nếu bạn chỉ định một hàm tạo và muốn sử dụng cả tham số và tham số, thì bạn phải xác định nó một cách rõ ràng. – Bartosz

Trả lời

24

Phải có một hàm tạo tham số, nhưng nó có thể là nội bộ hoặc riêng tư. ref question 3

+0

Tôi không biết nó có thể là riêng tư. Cảm ơn bạn. – Tyddlywink

+0

Tôi bắt đầu nhận được ngoại lệ khi tôi thay đổi constructor parameterless của tôi thành riêng tư. Có vẻ như sau khi thay đổi tất cả các loại phức tạp trong mô hình cụ thể đó sẽ trở lại null. – Nathan

+0

Trình xây dựng này được gọi thông qua sự phản chiếu từ khung thực thể –

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