Đâ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?
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
@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