2013-06-05 30 views
7

Tôi chưa từng làm việc với Entity Framework hoặc Generics trước đây và có một số khó khăn trong việc giảm mã của tôi.Có thể tạo phương pháp chung để thêm các mục vào dbset khung thực thể không?

Tôi đang phân tích cú pháp tệp văn bản để tải 10 bảng tra cứu có dữ liệu có thể thay đổi hàng đêm. Các tệp văn bản có tiêu đề cho "loại" theo sau là danh sách các bộ khóa/giá trị. Tôi có điều này làm việc hoàn hảo, nhưng tôi muốn refactor mã để làm sạch nó và muốn sử dụng phương pháp chung chung để thực hiện điều này vì vậy tôi có thể làm giảm mã trùng lặp.

Tôi đã nhận được phân tích cú pháp xuống một phương pháp chung, nhưng tôi đã không thể tìm ra cách để các thực thể được thêm vào ngữ cảnh theo cách chung chung. Tôi có để lặp qua một danh sách các thực thể đối với từng loại và thêm chúng vào bối cảnh:

void Main() 
{ 
    switch (line.ToUpper()) 
    { 
     case "AREA": 
     { 
      List<Area> areaList = this.GetItems<Area>(file); 

      foreach (var element in areaList) 
      { 
       if (context.Area.Find(element.Id) == null) 
       { 
        context.Area.Add(element); 
       } 
      } 

      break; 
     } 
     case "CATEGORY": 
     { 
      List<Category> categoryList = this.GetItems<Category>(file); 

      foreach (var element in categoryList) 
      { 
       if (context.Category.Find(element.Id) == null) 
       { 
        context.Category.Add(element); 
       } 
      } 

      break; 
     } 
    } 
} 

private List<T> GetItems<T>(StreamReader reader) where T : ILookupData, new() 
{ 
    string line; 
    List<T> list = new List<T>();    

    while (reader.Peek() == ' ') 
    { 
     line = reader.ReadLine().TrimStart(); 
     string[] tokens = line.Split(new string[] { " - " }, 2, StringSplitOptions.None); 

     T item = new T(); 
     item.Id = Convert.ToInt32(tokens[0]); 
     item.Description = (string)tokens[1]; 

     list.Add(item); 
    } 

    return list; 
} 

Cập nhật: Trên đây hoạt động tốt, nhưng dường như không thể có được bối cảnh gia tăng.

Tôi đã thử một vài điều khác nhau, nhưng dường như cứ bị lỗi này khi tôi cố gắng chung lên bối cảnh:

Loại 'T' phải là một loại tài liệu tham khảo để sử dụng nó như là tham số 'T' theo kiểu chung của phương thức.

Điều cuối cùng tôi đã cố gắng là để thêm một GetDbSet chung với bối cảnh:

public DbSet<T> GetDbSet<T>() where T : class 
{ 
    return this.Set<T>(); 
} 

Nhưng tôi nhận được lỗi tương tự trong bộ điều khiển của tôi thêm mã này vào GetItems phương pháp:

using (MyContext context = new MyContext()) 
{ 
    var dbSet = context.GetDbSet<T>(); 
} 
+0

Cố gắng thêm "nơi T: lớp" ràng buộc vào phương pháp GetItems của bạn – jure

+0

Điều đó không giúp thêm chức năng .Add . Các GetItems hiện đang hoạt động, nhưng tôi không thể sử dụng ngữ cảnh như 'context.Set () .Thêm (mục);' – Warheft

+0

Bạn cần cùng một ràng buộc trên cả hai phương pháp. Nếu Add có ràng buộc "class" hơn phương thức GetItems gọi là Add, cũng nên có ràng buộc "class". – jure

Trả lời

17

Tôi có một kho lưu trữ chung trong dự án hiện tại của mình. Đây là phương pháp bổ sung của nó:

public void Add<T>(T newItem) where T : class 
{ 
    db.Set<T>().Add(newItem); 
} 

nơi db là đối tượng DbContext riêng của mình. Các where T : class sửa lỗi đó về các loại tài liệu tham khảo. Nếu không có, bạn có thể vượt qua bất kỳ loại nào nhập bằng T, bao gồm bool hoặc struct hoặc bất kỳ loại giá trị nào mà DbSet.Add() không thể xử lý. where chỉ định rằng T phải là một lớp, là một loại tham chiếu, và do đó được cho phép.

+0

Câu trả lời hay và sạch –

+0

Điều đó làm việc cho kho lưu trữ, nhưng tôi vẫn nhận được lỗi nếu tôi cố gọi nó trong GetItems như sau: 'context.Set () .Thêm (mục);' hoặc 'context.Add (mục); ' – Warheft

+0

Đã tìm ra.Đó là một vấn đề thừa kế với việc sử dụng một giao diện thay vì một loại cụ thể. Bây giờ, tôi chỉ cần sửa đổi mô hình của tôi một chút. Cảm ơn bạn. – Warheft

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