如何在EF 5中使用具有公共基类的多个DbSets?

时间:2012-10-09 04:27:02

标签: c# entity-framework

我有2个POCO课程:

class Email: Base
{
   public int SomeProperty { get; set; } 
}

class Photo: Base
{
   public int SomeOtherProperty { get; set; } 
}

和基类

abstract class Base
{
     public DateTime DateCreated { get; set; }
}

这是我的上下文定义:

public class EntitiesContext : DbContext
{
    public DbSet<Email> Emails { get; set; }
    public DbSet<Photo> Photos { get; set; }
}

当然这里的这些类只是为了举例,事情要复杂得多。

基类只是为了每个表都有共同的属性 - 修改日期,状态等。我相信我使用Table-Per-Type方法。

问题:我有一些常见的业务逻辑需要针对每个表运行(例如,计算每种类型的非处理项)。 我需要一种方法来迭代一组具有公共基类的表。我希望能做到这样的事情:

private void GoThroughAllTables(Action<DbSet<Base>> fnProcess, bool needSave)
{
    using (var db = new EntitiesContext())
    {
        fnProcess(db.Emails);
        fnProcess(db.Photos);

        if (needSave == true)
        {
            db.SaveChanges();
        }
    }
}

public IEnumerable<QueueStatus> GetQueueStatus()
{
    var res = new List<QueueStatus>();

    GoThroughAllTables((set) =>
    {
        res.Add(new QueueStatus
        {
            Count = set.Cast<Base>().Count(x => x.DateCreated > someDate),
        });
    }, false);

    return res;
}

public void DeleteFailedItems()
{
    GoThroughAllTables((set) =>
    {
        set.Cast<Base>().Remove(x => x.DateCreated > someDate);
    }, true);

    return res;
}

这不会编译:

fnProcess(db.Emails);
  

参数1:无法从'System.Data.Entity.DbSet | Email |'转换至   'System.Data.Entity.DbSet |基地|'

传递非类型的DbSet将无效,因为Cast将失败。

所以我不确定我还能尝试什么。有什么建议吗?

0 个答案:

没有答案