通用数据库保存

时间:2017-08-31 18:12:19

标签: c# entity-framework asp.net-mvc-4 generics

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

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创建的自动生成的分部类。所以例如我的观点是

public class MyView : BaseViewInterface<My>

我将是作为db上下文的一部分创建的自动生成的类。所以我的问题很简单。我在这做错了什么?如何进行这种通用的保存工作?

修改:我无法修改AppsRTSEntities以包含T的定义,因为它也是自动生成的。{1}}

1 个答案:

答案 0 :(得分:2)

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

    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;
    }