LINQ to Entities Casting Issues - 无法将对象转换为Generic类型 [英] LINQ to Entities Casting Issues - Unable to cast object to Generic type

查看:127
本文介绍了LINQ to Entities Casting Issues - 无法将对象转换为Generic类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我收到的错误:


Message =无法将类型App.Models.Subject键入
'App.Context.ITenantData'。LINQ to Entities仅支持投射EDM
原始或枚举类型。

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."



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

In an attempt to implement multi-tenancy in my application, I added a Tenants table and linked every tenant-specific model to a Tenant (including Subjects).

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

I got a lot of help from this post: DbSet, ModelBuilder, and EF Navigation Properties

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

But now I'm stuck with the above casting issue.

我的TenantContext:

My 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:

With ITenantData:

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

主题用TenantId属性实现ITenantData:

And Subject implements ITenantData with a TenantId property:

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

现在,当我使用TenantContext查询时,我得到以上错误:

Now, when I query using TenantContext, I get the above error:

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

我做错了什么?

另外 - 我很新,所以如果我在这里缺少任何关键的东西,让我知道,我会发布。感谢您提供的任何帮助。

Also - I'm pretty new to this, so if I'm missing anything critical here, let me know and I'll post up. Thank you for any help you can provide.

推荐答案

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

Updating my TenantContext to include class fixed the problem, but I don't know why:

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

如果有人想写出关于这个背后的推理的一切,我会很乐意接受你的回答。

If anyone wants to write up anything about the reasoning behind this, I'll gladly accept your answer.

这篇关于LINQ to Entities Casting Issues - 无法将对象转换为Generic类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆