0

这是我收到的错误:

消息 =“无法将类型 'App.Models.Subject' 转换为类型 'App.Context.ITenantData'。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。”

为了在我的应用程序中实现多租户,我添加了一个租户表并将每个特定于租户的模型链接到一个租户(包括主题)。

我从这篇文章中得到了很多帮助:DbSet、ModelBuilder 和 EF 导航属性

但现在我被上面的铸造问题困住了。

我的租户上下文:

 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; }
}

Subject 使用 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

我究竟做错了什么?

另外 - 我对此很陌生,所以如果我在这里遗漏了任何重要的内容,请告诉我,我会发布。感谢您提供任何帮助。

4

2 回答 2

2

更新我的 TenantContext 以包含class解决问题,但我不知道为什么:

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

如果有人想写下这背后的原因,我很乐意接受你的回答。

于 2013-11-04T23:17:24.543 回答
-1

这里:

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

翻译者不知道如何将 _tenant.TenantId 翻译成 SQL

于 2013-11-04T22:07:37.107 回答