【问题标题】:How do you get the DataContext of a LINQ to SQL Entity?如何获取 LINQ to SQL 实体的 DataContext?
【发布时间】:2011-10-06 09:11:28
【问题描述】:
目前这是我所拥有的:
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?
【问题讨论】:
标签:
linq-to-sql
datacontext
【解决方案1】:
抱歉,这是不可能的。在这种情况下,实体或可查询对象不会直接引用上下文。
【解决方案2】:
您可以通过确定是否连接了 PropertyChanging 事件来使用反射来实现这一点,但认为这是一种 hack,也许您可以通过更好的设计避免使用它。
我们的用例是在 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);
}