c# – 在实体类中访问LINQ-2-SQL DataContext
有没有任何简单的方式来访问
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.在使用它之前,请先做一些更多的错误检查! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Oracle7.X 回滚表空间数据文件误删除处理方法
- Oracle基础知识笔记之一
- Oracle 12cR1新特性导致的性能问题---MMON进程消耗了很高的
- c – 无法将列表迭代器强制转换为对象
- C的哪些特性让模板类在没有模板参数的情况下引用自己?
- c – 是否建议将指针指向堆内存为“const”?
- c# – Entity Framework核心:无法添加迁移:无参数构造函数
- react中componentWillReceiveProps()在props不改变的时候也
- c# – URL重写使用Global.asax不起作用
- VUE Error: getaddrinfo ENOTFOUND localhost