如何获得LINQ to SQL实体的DataContext?

时间:2011-07-15 18:06:47

标签: linq-to-sql datacontext

目前这就是我所拥有的:

public partial class LinqToSqlEntity {
    public IQueryable<AnotherLinqToSqlEntity> AnotherLinqToSqlEntities {
        using(DataContext context = new DataContext) {
            return context.AnotherLinqToSqlEntities.Where(item => item.Property == SOME_VALUE);
        }
    }
}

有没有办法获取 this 的DataContext,这样我就不需要创建新的DataContext了?

2 个答案:

答案 0 :(得分:2)

抱歉,这是不可能的。在这种情况下,实体或可以使用的实体不会直接引用上下文。

答案 1 :(得分:1)

你可以通过弄清楚PropertyChanging事件是否被连接来实现这一点,但是考虑到这是一个黑客,也许你可以避免使用更好的设计。 我们的用例是在detach_EntityName委托中,我们更改默认的Linq行为,只删除记录的外键(将其设置为null),并从DB中实际删除。

public static DataContext GetDataContextFromEntityObject(object entity) 
{
    // Use a reflection to get the invocaiton list.
    var o = (PropertyChangingEventHandler)entity.GetType().GetField("PropertyChanging", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(entity);
    var o = GetFieldValue(entity, "PropertyChanging");

    if (o == null) return null;
    var invocationList = o.GetInvocationList();
    if (invocationList != null)
    {
        // DataContext changes are tracked through StandardChangeTracker
        object changeTracker = (from i in invocationList where i.Target.GetType().FullName == "System.Data.Linq.ChangeTracker+StandardChangeTracker" select i.Target).FirstOrDefault();
        if (changeTracker != null)
        {
            object services = GetFieldValue(changeTracker, "services");
            return (DataContext)GetFieldValue(services, "context");
        }
    }

    return null;
}

private static object GetFieldValue(object instance, string propertyName)
{
    return instance.GetType().GetField(propertyName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(instance);
}