2013-11-04 32 views
0

這是我收到的錯誤:LINQ到實體鑄造的問題 - 無法施展對象泛型類型

Message = "Unable to cast the type 'App.Models.Subject' to type 'App.Context.ITenantData'. LINQ to Entities only supports casting EDM primitive or enumeration types."

在試圖實現我的應用程序的多租戶,我添加了一個租戶表將每個特定於租戶的模型與租戶(包括主題)相關聯。

我得到了很多的幫助,從這個帖子:DbSet, ModelBuilder, and EF Navigation Properties

但現在我堅持了上述鑄造的問題。

我TenantContext:

public class TenantContext : DbContext { 

    private readonly RealContext _realContext; 
    private readonly Tenant _tenant; 

    public TenantContext(Tenant tenant) 
     : base("name=DefaultConnection") { 
     this._tenant = tenant; 
     this._realContext = new RealContext(); 
    } 

    // _realContext.Subjects is a DbSet 
    public IQueryable<Subject> Subjects { get { return FilterTenant(_realContext.Subjects); } } 

    private IQueryable<T> FilterTenant<T>(IQueryable<T> values) where T : ITenantData 
    { 
     return values.Where(x => x.TenantId == _tenant.TenantId); 
    } 
} 

隨着ITenantData:

public interface ITenantData { 
    int TenantId { get; set; } 
} 

與學科有TenantId屬性實現ITenantData:

[ForeignKey("Tenant")] 
    public int TenantId { get; set; } 

現在,當我查詢使用TenantContext,我得到上面的錯誤:

using (var db = CreateContext()) { // returns tenantContext 
      var dbSubjects = db.Subjects; 
      var subjects = dbSubjects.ToList(); // error occurs here 

我在做什麼錯?

另外 - 我很新,所以如果我錯過了關鍵的任何東西,讓我知道,我會張貼。感謝您提供任何幫助。

回答

1

更新我的TenantContext包括class解決了這一問題,但我不知道爲什麼:

private IQueryable<T> FilterTenant<T>(IQueryable<T> values) where T : class, ITenantData 
{ 
    return values.Where(x => x.TenantId == _tenant.TenantId); 
} 

如果有人想寫出任何有關這背後的推理,我會很樂意接受你的答案。

+0

好的,現在就讓我自己的樣子吧。 – LINQ2Vodka

+0

This Works:private IQueryable FilterTenant(IQueryable values) { return values.Where(x => x.TenantId == _tenant.TenantId); } 它解決了這個問題嗎? – LINQ2Vodka

-1

這裏:

values.Where(x => x.TenantId == _tenant.TenantId); 

翻譯可是沒有一個想法如何_tenant.TenantId轉化爲SQL

+0

有趣...感謝您的洞察力。你將如何解決它? – SB2055

+0

你只能通過那裏簡單的類型,如int,而不是對象 – LINQ2Vodka

+0

我試圖傳遞一個id在該函數無濟於事(tenantId而不是_tenant.TenantId) - 想法? – SB2055