【问题标题】: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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2012-12-25
        • 1970-01-01
        相关资源
        最近更新 更多