目前这就是我所拥有的:
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了?
答案 0 :(得分:2)
抱歉,这是不可能的。在这种情况下,实体或可以使用的实体不会直接引用上下文。
答案 1 :(得分:1)
你可以通过弄清楚PropertyChanging事件是否被连接来实现这一点,但是考虑到这是一个黑客,也许你可以避免使用更好的设计。 我们的用例是在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);
}