c# – 在实体类中访问LINQ-2-SQL DataContext

c# – 在实体类中访问LINQ-2-SQL DataContext,第1张

概述有没有任何简单的方式来访问 linq2sql实体类中的DataContext. 我正在尝试创建像EntitySet这样的东西,但是我无法弄清楚EntitySet如何访问创建实体对象的上下文. 我想要一个常规的linq2sql实体类,该类有一个方法可以访问创建它的DataContext.我知道这是可能的,因为当你有一个主键linq2sql的实体类时,你可以选择加载所有的子代而不创建一个新的DataC 有没有任何简单的方式来访问 linq2sql实体类中的DataContext.

我正在尝试创建像EntitySet这样的东西,但是我无法弄清楚EntitySet如何访问创建实体对象的上下文.

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

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

首先,为所有实体创建一个接口,以实现从INotifyPropertyChanging继承的接口.这是用来连接一些扩展方法,并保持我们的实现很好分离.在我的情况下,该接口称为ISandBoxObject:

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

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

/// <summary>    /// Obtain the DataContext provIDing this entity    /// </summary>    /// <param name="obj"></param>    /// <returns></returns>    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.在使用它之前,请先做一些更多的错误检查!

总结

以上是内存溢出为你收集整理的c# – 在实体类中访问LINQ-2-SQL DataContext全部内容,希望文章能够帮你解决c# – 在实体类中访问LINQ-2-SQL DataContext所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1259965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存