通用数据库保存

Generic Database Save

在我的代码中,我使用相同的方法将大量 classes 一遍又一遍地保存到数据库中。所以我尝试抽象一下,如下图:

public long Save<T>(BaseViewInterface<T> view, AppsRTSEntities dbContext)
{
    try
    {
        if (view.IsNew())
        {
            return Create(view, dbContext);
        }
        else
        {                
            T tmp = view.ToPersistent(dbContext);
            dbContext.T.Attach(tmp);
            dbContext.Entry(tmp).State = System.Data.Entity.EntityState.Modified;

            dbContext.SaveChanges();

            return tmp.ID;
        }
    }
    catch (DbEntityValidationException exc)
    {
        throw new DbEntityValidationException(GetExceptionMsg(exc), exc);
    }
    catch (DbUpdateException exc)
    {
        throw new DbEntityValidationException(GetExceptionMsg(exc), exc);
    }
}

T 是 Microsoft 创建的自动生成的部分 class。例如,我的观点是

public class MyView : BaseViewInterface<My>

My 将是作为数据库上下文的一部分创建的自动生成的 class。所以我的问题很简单。我在这里做错了什么?我怎样才能使这个通用的保存工作?

编辑:我不能只修改 AppsRTSEntities 以包含 T 的定义,因为它也是自动生成的。

您需要使用 DbContext.Set<T>() 方法来获取通用 DbSet 数据类型,而不是 dbContext.T.Attach(tmp);

    else
    {                
        T tmp = view.ToPersistent(dbContext);
        //Could also do "dbCondext.Set<T>().Attach(tmp);"  but I split it for this example
        DbSet<T> t = dbCondext.Set<T>();
        t.Attach(tmp);
        dbContext.Entry(tmp).State = System.Data.Entity.EntityState.Modified;

        dbContext.SaveChanges();

        return tmp.ID;
    }