通用数据库保存
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;
}
在我的代码中,我使用相同的方法将大量 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;
}