Bob*_*y Z 9 .net c# linq linq-to-sql
是否有任何简单的方法来访问DataContextlinq2sql实体类.
我正在尝试创建类似EntitySet但我无法弄清楚如何EntitySet访问创建实体对象的上下文.
我希望有一个常规的linq2sql实体类,让类可以访问DataContext创建它的方法.我知道这是可能的,因为当你有一个带有主键的实体类时,linq2sql可以让你选择加载所有子进程而不创建新的DataContext.
我只需做同样的事情.这是我的解决方案(虽然可能不是最好的方法,但至少相当优雅):
首先,为所有实体创建一个接口,以实现从INotifyPropertyChanging继承的接口.这用于连接一些扩展方法,并使我们的实现保持良好的单独.在我的例子中,接口称为ISandboxObject:
public interface ISandboxObject : INotifyPropertyChanging
{
// This is just a marker interface for Extension Methods
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个新的静态类以包含一个扩展方法来获取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");
}
Run Code Online (Sandbox Code Playgroud)
现在您有了一个很好的扩展方法,它将为您提供来自任何实现ISandboxObject的对象的DataContext.在愤怒中使用它之前,请在此进行更多错误检查!
基本上,没有。
该类EntitySet<T>有一个Source由数据上下文分配的内部属性,这就是它按需获取数据的方式。然而,数据类本身没有任何相似之处。
然而,我相信实体框架对此有更多的访问权限,但代价是强制的对象层次结构。
与实体框架不同,LINQ-to-SQL(按设计)可以与常规的、持久性无知的类一起使用 - 因此它不假设它可以访问这种类型的数据。
| 归档时间: |
|
| 查看次数: |
6577 次 |
| 最近记录: |