5

Tôi có một lớp cơ sở và hai lớp dẫn xuất.Entity Framework không truy vấn các lớp dẫn xuất - Lỗi trong DbOfTypeExpression

Mỗi lớp có nguồn gốc thực hiện cùng loại với thuộc tính - khác biệt duy nhất là tên thuộc tính.

Đáng buồn là tôi không có nhiều ảnh hưởng đến thiết kế lớp -> chúng đã được tạo từ tệp wsdl.

Sau đó tôi có thuộc tính trên BaseType để đóng gói thuộc tính chung. Kế hoạch là sử dụng tài sản này trong lần xem web của tôi, vv

Tôi đã sử dụng nổi tiếng "Fruit-Ví dụ" để chứng minh vấn đề:

public class FruitBase 
    { 
     public virtual int ID { get; set; } 


     // 
     // The plan is to use this property in mvc view 
     // 
     [NotMapped] 
     public virtual FruitnessFactor Fruitness 
     { 
      get 
      { 
       if (this.GetType().BaseType == typeof(Apple)) 
        return ((Apple)this).AppleFruitness; 
       else if (this.GetType().BaseType == typeof(Orange)) 
        return ((Orange)this).OrangeFruitness; 
       else 
        return null; 
      } 
     } 
    } 

public class FruitnessFactor { } 

Trong điều khiển MVC của tôi, các truy vấn sau đây làm việc hoàn toàn tốt :

return View(context.FruitEntities 
          .OfType<Apple>().Include(a =>a.AppleFruitness) 
          .ToList()); 

Nhưng cái này không:

return View(context.FruitEntities 
            .OfType<Apple>().Include(a =>a.AppleFruitness) 
            .OfType<Orange>().Include(o => o.OrangeFruitness) 
            .ToList()); 

thông báo lỗi tôi nhận được là :

DbOfTypeExpression yêu cầu đối số biểu thức có loại kết quả đa hình tương thích với đối số loại.

Tôi đang sử dụng EF 5.0 RC và phương pháp tiếp cận Mã đầu tiên.

Bất kỳ trợ giúp nào được đánh giá cao!

+3

này có lẽ vì bạn biểu hiện ngụ ý 'Orange' là một' Apple' – Eranga

+0

Tôi sẽ nghĩ bằng cách xác định FruitEntities của tôi là 'DbSet FruitEntities' biểu hiện ngụ ý rằng Orange và Apple là trái cây ?! – Flo

+0

Chuỗi 'OfType' nói:" Lọc tất cả táo từ FruitEntities và sau đó lọc từ kết quả tất cả táo là cam "chỉ có ý nghĩa nếu cam là táo, tức là lớp' Orange' thừa kế từ lớp 'Apple'. Bạn muốn đạt được điều gì với truy vấn đó? Danh sách kết hợp cam và táo, nghĩa là tất cả các loại trái cây là táo ** hoặc ** cam? – Slauma

Trả lời

7

Theo như tôi có thể nói, bạn không thể áp dụng Include trên nhiều loại phụ trong một truy vấn cơ sở dữ liệu duy nhất. Bạn có thể truy vấn một loại (OfType<Apple>().Include(a => a.AppelFruitness)) và tương tự cho một loại phụ khác. Vấn đề là bạn không thể concat các kết quả trong cùng một truy vấn bởi vì các bộ sưu tập kết quả có các loại generic khác nhau (táo và cam).

Một tùy chọn là chạy hai truy vấn và sao chép bộ sưu tập kết quả vào bộ sưu tập mới của loại cơ sở - như bạn đã chỉ ra trong phần nhận xét bên dưới câu hỏi của bạn.

Tùy chọn khác (chỉ cần một truy vấn) là phép chiếu. Bạn sẽ phải xác định một loại chiếu (bạn cũng có thể chiếu vào một loại vô danh) ...

public class FruitViewModel 
{ 
    public FruitBase Fruit { get; set; } 
    public FruitnessFactor Factor { get; set; } 
} 

... và sau đó có thể sử dụng các truy vấn:

List<FruitViewModel> fruitViewModels = context.FruitEntities 
    .OfType<Apple>() 
    .Select(a => new FruitViewModel 
    { 
     Fruit = a, 
     Factor = a.AppleFruitness 
    }) 
    .Concat(context.FruitEntities 
    .OfType<Orange>() 
    .Select(o => new FruitViewModel 
    { 
     Fruit = o, 
     Factor = o.OrangeFruitness 
    })) 
    .ToList(); 

Nếu bạn không vô hiệu hóa theo dõi thay đổi (bằng cách sử dụng AsNoTracking) các thuộc tính điều hướng được điền tự động khi các thực thể được gắn vào ngữ cảnh ("Quan hệ ..."

IEnumerable<FruitBase> fruits = fruitViewModels.Select(fv => fv.Fruit); 

... và bạn sẽ nhận được các loại trái cây bao gồm các thuộc tính FruitnessFactor.

Mã này là khá vụng về nhưng một cách tiếp cận trực tiếp mà không cần sử dụng một chiếu đã được hỏi nhiều lần nhưng không thành công:

+0

Tôi nghĩ rằng tôi sẽ cho giải pháp truy vấn 2. Tôi chỉ sợ một tác động hiệu suất nếu người ta xem xét rằng tôi cần phải phân loại, phân trang và các công cụ như thế. Nhưng cho đến nay nó có vẻ tốt. Chúc mừng! – Flo

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