0

我的主要目标是重写 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();

4

0 回答 0