0

我有一个类Tenant继承自UserProfile。我使用的table-per-类型继承,所以我的上下文类看起来是这样的:使用MVC脚手架存储库与继承类(表类型)不起作用

// 1 DbSet for superclass UserProfile 
public DbSet<LetLord.Models.UserProfile> UserProfile { get; set; } 

我使用存储库类我的数据访问和我创建TenantRepository用下面的软件包管理器命令:

脚手架控制器租客-repository

当我尝试运行我的应用程序,在TenantRepository到租客的所有引用抛出下面的错误...

'MyNamespace.MyContext'不包含'Tenant'的定义,并且找不到'Tenant'接受第一个参数'MyNamespace.MyContext'的扩展名。

......比如下面的参考:

public IQueryable<Tenant> All 
{ 
    get { return context.Tenant; } // error line here 
} 

当使用表每类型继承只有DbSet为基类应该包括在内,所以我明白为什么我得到错误。

如何在像我这样的场景中实现派生类的存储库?


编辑

使用.Add().Find().Remove()等时,如何在上面实现的呢?如上面对于前面提到的方法描述

同样的错误:

public Tenant Find(int id) 
{ 
    return context.UserProfile.OfType<Tenant>().Find(id); // error at .Find() 
} 

回答

1

试试这个:

public IQueryable<Tenant> All 
{ 
    get { return context.UserProfile.OfType<Tenant>(); } 
} 

这只会返回租户。

对于其他的方法,如添加,查找,删除:

public Tenant Find(int id) 
{ 
    // a few different options here -- assumes your key property is Id 
    return context.UserProfile.OfType<Tenant>().SingleOrDefault(t => t.Id == id); 

    // option 2 
    // even though your context does not expose a DbSet<Tenant>, you can still 
    // use the Set<TResult>() method to get only tenants this way 
    return context.Set<Tenant>().Find(id); 
} 

public void Add(Tenant tenant) 
{ 
    context.Add(tenant); 
} 

public void Remove(Tenant tenant) 
{ 
    context.Set<Tenant>().Remove(tenant); 
} 
+0

谢谢,这工作,但请参阅编辑RE其他库的方法。 – MattSull 2013-02-27 14:52:01

+0

我不知道这些方法是什么样子,但我会给它一个镜头。 – Dismissile 2013-02-27 14:54:09

+0

它们是在运行问题中描述的包管理器命令时自动创建的存储库类的一部分。 – MattSull 2013-02-27 14:56:52