Entity framework 首先使用实体框架代码最有效地处理创建、更新和删除
注意:我使用的是实体框架版本5 在我的通用存储库中,我有如下Entity framework 首先使用实体框架代码最有效地处理创建、更新和删除,entity-framework,ef-code-first,dbcontext,entity-framework-5,Entity Framework,Ef Code First,Dbcontext,Entity Framework 5,注意:我使用的是实体框架版本5 在我的通用存储库中,我有如下添加、编辑和删除方法: public class EntityRepository<T> : IEntityRepository<T> where T : class, IEntity, new() { readonly DbContext _entitiesContext; public EntityRepository(DbContext entitiesContext) {
添加
、编辑
和删除
方法:
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);
}
}
}
用于添加:
public bool Add<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Added;
Save();
}
这只是我的通用存储库的一部分。它在企业应用程序中非常有效
更新:
public bool Update<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Modified;
Save();
}
public bool Delete<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Deleted;
Save();
}
分离仅影响传递给方法的特定对象。如果
正在分离的对象在对象上下文中具有相关对象,即
对象不会分离
当设置实体的状态或调用SaveChanges()
时,EF将自动在图形中附加分离的对象
我真的不知道为什么需要从上下文中分离对象。您还可以使用
AsNoTracking()
从数据库加载实体而不首先将其附加到上下文。如果要传递到Add
或Edit
方法的对象处于distached
状态,会发生什么情况?这是否代替了在DbContext或存储库中具有IDbSet
属性?这非常完美。非常感谢。where E:class
的目的是什么?不确定谷歌能找到更多关于它的信息吗?@Cody这是一个约束,因此类型参数必须是引用类型@CoffeeAddict它是EF 5.0.0。DB first或Code first,我想这并不重要,因为这是一个通用的存储库代码。您可以使用新发布的库,它将自动设置实体图中所有实体的状态。你可以阅读。
public bool Delete<E>(E entity) where E : class
{
DataContext.Entry(entity).State = System.Data.EntityState.Deleted;
Save();
}
private bool Save()
{
return DataContext.SaveChanges() > 0;
}