LINQ到实体铸造的问题 - 无法施展对象泛型类型 [英] LINQ to Entities Casting Issues - Unable to cast object to Generic type

查看:91
本文介绍了LINQ到实体铸造的问题 - 无法施展对象泛型类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我收到的错误:

消息=无法转换类型'App.Models.Subject到类型
  App.Context.ITenantData。 LINQ到实体仅支持铸造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).

我得到了很多,从这个帖子的帮助:<一href=\"http://stackoverflow.com/questions/19758080/dbset-modelbuilder-and-ef-navigation-properties/19759042#comment29397086_19759042\">DbSet,模型构建器和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; }
}

和主题实现ITenantData与Ten​​antId属性:

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

我是什么做错了吗?

What am I doing wrong?

此外 - 我是pretty新本,所以如果我在这里错过什么重要的,让我知道,我会张贴。感谢您的帮助,您可以提供。

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包括解决了问题,但我不知道为什么:

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到实体铸造的问题 - 无法施展对象泛型类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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