2011-07-15 74 views
4

目前,這是我所:如何獲得LINQ to SQL實體的DataContext?

public partial class LinqToSqlEntity { 
    public IQueryable<AnotherLinqToSqlEntity> AnotherLinqToSqlEntities { 
     using(DataContext context = new DataContext) { 
      return context.AnotherLinqToSqlEntities.Where(item => item.Property == SOME_VALUE); 
     } 
    } 
} 

有沒有辦法讓這個的DataContext這樣我就不需要創建一個新的DataContext?

回答

2

對不起,這是不可能的。在這種情況下,一個實體或可排隊的人不會直接引用上下文。

1

您可以通過確定PropertyChanging事件是否已連接起來,通過反射來實現此目的,但認爲這是一種破解,也許您可​​以避免在更好的設計中使用它。 我們的用例是在detach_EntityName委託中,我們更改了只刪除記錄的外鍵(將其設置爲null)的默認Linq行爲,並且實際從數據庫中刪除。

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); 
}