当前位置:  开发笔记 > 编程语言 > 正文

访问实体类中的LINQ-2-SQL DataContext

如何解决《访问实体类中的LINQ-2-SQLDataContext》经验,为你挑选了1个好方法。

是否有任何简单的方法来访问DataContextlinq2sql实体类.

我正在尝试创建类似EntitySet但我无法弄清楚如何EntitySet访问创建实体对象的上下文.

我希望有一个常规的linq2sql实体类,让类可以访问DataContext创建它的方法.我知道这是可能的,因为当你有一个带有主键的实体类时,linq2sql可以让你选择加载所有子进程而不创建新的DataContext.



1> Dan..:

我只需做同样的事情.这是我的解决方案(虽然可能不是最好的方法,但至少相当优雅):

首先,为所有实体创建一个接口,以实现从INotifyPropertyChanging继承的接口.这用于连接一些扩展方法,并使我们的实现保持良好的单独.在我的例子中,接口称为ISandboxObject:

public interface ISandboxObject : INotifyPropertyChanging
{
    // This is just a marker interface for Extension Methods
}

然后创建一个新的静态类以包含一个扩展方法来获取DataContext.这是通过在附加到INotifyPropertyChanging.PropertyChanging事件的LINQ Change Tracker上查找事件处理程序来实现的.一旦我们找到了更改跟踪器,我们就可以从那里获取DataContext:

    /// 
    /// Obtain the DataContext providing this entity
    /// 
    /// 
    /// 
    public static DataContext GetContext(this ISandboxObject obj)
    {
        FieldInfo fEvent = obj.GetType().GetField("PropertyChanging", BindingFlags.NonPublic | BindingFlags.Instance);
        MulticastDelegate dEvent = (MulticastDelegate)fEvent.GetValue(obj);
        Delegate[] onChangingHandlers = dEvent.GetInvocationList();

        // Obtain the ChangeTracker
        foreach (Delegate handler in onChangingHandlers)
        {
            if (handler.Target.GetType().Name == "StandardChangeTracker")
            {
                // Obtain the 'services' private field of the 'tracker'
                object tracker = handler.Target;
                object services = tracker.GetType().GetField("services", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(tracker);

                // Get the Context
                DataContext context = services.GetType().GetProperty("Context").GetValue(services, null) as DataContext;
                return context;
            }
        }

        // Not found
        throw new Exception("Error reflecting object");
    }

现在您有了一个很好的扩展方法,它将为您提供来自任何实现ISandboxObject的对象的DataContext.在愤怒中使用它之前,请在此进行更多错误检查!

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有