我的主要目标是重写 ObjectSet 的 DeleteObject 方法。我正在使用 EntityFramework 6 和我从 EF 4.x 迁移的 ObjectContext。编辑:我修改了创建 ObjectContext 的 T4 模板以关联上下文上的所有 ObjectSet 以使用 MyObjectSet 而不是标准,但我想以相同的方式使用它: context.HijackedSet.Where(i=> i.blah == 'blah')
编辑:我只遇到嵌套 ObjectSet 调用的问题,例如
(from p in context.SomeTable
let poco = new MyExcellentPOCO
{
Name = p.Name,
OtherProperty = context.UnrelatedTable.Where(i=> i.LimitingFactor = x)
}
select poco).ToList()
不幸的是,ObjectSet 使用了一个我无法从它继承的内部构造函数。相反,我使用 ObjectSet 属性创建了自己的版本,并传递给所有 ObjectSet 方法的属性
代码:
public class MyObjectSet<TEntity> : IObjectSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable where TEntity : class
{
public MyObjectSet(ObjectSet<TEntity> objectSet)
{
ObjectSet = objectSet;
}
public ObjectSet<TEntity> ObjectSet { get; set; }
public void DeleteObject(TEntity entity)
{
if (entity is IEnforceLogicalDelete)
{
((IEnforceLogicalDelete)entity).IsDeleted = true;
}
else
{
ObjectSet.DeleteObject(entity);
}
}
public void AddObject(TEntity entity)
{
ObjectSet.AddObject(entity);
}
public void Attach(TEntity entity)
{
ObjectSet.Attach(entity);
}
public void Detach(TEntity entity)
{
ObjectSet.Detach(entity);
}
public IEnumerator<TEntity> GetEnumerator()
{
return ((IEnumerable<TEntity>)ObjectSet).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<TEntity>)ObjectSet).GetEnumerator();
}
public Type ElementType
{
get { return typeof(TEntity); }
}
public Linq.Expressions.Expression Expression
{
get
{
return ObjectSet.AsQueryable<TEntity>().Expression;
}
}
public IQueryProvider Provider
{
get { return ObjectSet.AsQueryable<TEntity>().Provider; }
}
public ObjectQuery<TEntity> Include(string path)
{
return ObjectSet.Include(path);
}
}
MyObjectSet 因为它是在上下文中实现的:
public MyObjectSet<Address> Addresses
{
get
{
if ((_Addresses == null))
{
_Addresses = new MyObjectSet<Address>(base.CreateObjectSet<Address>("Addresses"));
}
return _Addresses;
}
}
private MyObjectSet<Address> _Addresses;
我检查了 ObjectQuery 类(ObjectSet 继承自 ObjectQuery),它实现IEnumerator IEnumerable.GetEnumerator()
为return ((IEnumerable<T>)this).GetEnumerator();
. 我对属性的使用会改变结果吗?return ((IEnumerable<TEntity>)ObjectSet).GetEnumerator();