tug*_*erk 28 entity-framework ef-code-first dbcontext entity-framework-5
注意:我使用的是Entity Framework第5版
在我的通用库,我有Add,Edit和Delete下面的方法:
public class EntityRepository<T> : IEntityRepository<T>
where T : class, IEntity, new() {
readonly DbContext _entitiesContext;
public EntityRepository(DbContext entitiesContext) {
if (entitiesContext == null) {
throw new ArgumentNullException("entitiesContext");
}
_entitiesContext = entitiesContext;
}
//...
public virtual void Add(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State != EntityState.Detached) {
dbEntityEntry.State = EntityState.Added;
}
else {
_entitiesContext.Set<T>().Add(entity);
}
}
public virtual void Edit(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State == EntityState.Detached) {
_entitiesContext.Set<T>().Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}
public virtual void Delete(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State != EntityState.Detached) {
dbEntityEntry.State = EntityState.Deleted;
}
else {
DbSet dbSet = _entitiesContext.Set<T>();
dbSet.Attach(entity);
dbSet.Remove(entity);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您认为这些方法是否得到了很好的实施?特别是Add方法.实现Add下面的方法会更好吗?
public virtual void Add(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State == EntityState.Detached) {
_entitiesContext.Set<T>().Attach(entity);
}
dbEntityEntry.State = EntityState.Added;
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*cic 37
添加:
public bool Add<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Added;
Save();
}
Run Code Online (Sandbox Code Playgroud)
更新:
public bool Update<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Modified;
Save();
}
Run Code Online (Sandbox Code Playgroud)
删除:
public bool Delete<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Deleted;
Save();
}
Run Code Online (Sandbox Code Playgroud)
还有一个Save()返回true或false 的私有方法,因此您可以根据结果轻松地在控制器中回退
private bool Save()
{
return DataContext.SaveChanges() > 0;
}
Run Code Online (Sandbox Code Playgroud)
这只是我的通用存储库的一部分.它在企业应用程序中非常有用.
更新:
分离仅影响传递给方法的特定对象.如果正在分离的对象在对象上下文中具有相关对象,则不会分离这些对象.
设置实体的状态或SaveChanges()调用时,EF将自动附加图中的分离对象.
我真的不知道你为什么需要从上下文中分离对象.您还可以使用AsNoTracking()从数据库加载实体,而无需首先将它们附加到上下文中.
| 归档时间: |
|
| 查看次数: |
28382 次 |
| 最近记录: |