如何从with-in DataContext类中公开DataContext?

时间:2010-11-10 00:59:53

标签: c# asp.net-mvc linq-to-sql

在DataContext中扩展类时是否可以公开DataContext?考虑一下:

public partial class SomeClass {
    public object SomeExtraProperty {
        this.DataContext.ExecuteQuery<T>("{SOME_REALLY_COMPLEX_QUERY_THAT_HAS_TO_BE_IN_RAW_SQL_BECAUSE_LINQ_GENERATES_CRAP_IN_THIS INSTANCE}");
    }
}

我该怎么做呢?我现在有一个草率的版本,我将DataContext传递给视图模型,然后我将它传递给我在partial类中设置的方法。我想避免传递整个DataContext,只是有一个我可以引用的属性。

@Aaronaught更新

那么,我将如何编写代码呢?我知道这是一个模糊的问题,但是到目前为止我在网上看到的所有教程都觉得他们认为我知道在哪里放置代码以及如何使用它等等。

假设我有一个非常简单的应用程序结构为(在文件夹中):

  • 控制器
  • 模型
  • 浏览

存储库文件在哪里?在Models文件夹中,还是可以为它们创建“存储库”文件夹?

过去知道存储库如何识别DataContext?我是否必须在存储库的每个方法中创建它的新实例(如果这样看起来效率不高......并且不会导致将对象拉出一个实例并在使用它的控制器中使用它的问题另一个例子......)?

例如我目前有这个设置:

public class BaseController : Controller {
    protected DataContext dc = new DataContext();
}

public class XController : BaseController {
    // stuff
}

这样我就可以从继承自BaseController的所有控制器获得“全局”DataContext。我的理解是,这是有效的(我可能是错的......)。

在我的Models文件夹中,我有一个“Collections”文件夹,它真正用作ViewModels:

public class BaseCollection {
    // Common properties for the Master page
}

public class XCollection : BaseCollection {
    // X View specific properties
}

那么,考虑所有这些以及如何将存储库插件?它会是这样的(使用我的应用程序的真实对象):

public interface IJobRepository {
    public Job GetById(int JobId);
}

public class JobRepository : IJobRepository {
    public Job GetById(int JobId) {
        using (DataContext dc = new DataContext()) {
            return dc.Jobs.Single(j => (j.JobId == JobId));
        };
    }
}

此外,界面有什么意义?是这样的其他服务可以连接到我的应用程序?如果我不计划拥有这样的能力该怎么办?

接下来,拥有一个收集真实对象的所有信息的抽象对象会更好吗?例如,IJob对象具有Job的所有属性+我可能要添加的其他属性,例如Name?那么存储库将更改为:

public interface IJobRepository {
    public IJob GetById(int JobId);
}

public class JobRepository : IJobRepository {
    public IJob GetById(int JobId) {
        using (DataContext dc = new DataContext()) {
            return dc.Jobs.Single(j => new IJob {
                Name = dc.SP(JobId)  // of course, the project here is wrong,
                                     // but you get the point...
            });
        };
    }
}

我的脑袋现在很困惑。我很乐意从头到尾看到一个教程,即“文件 - &gt;新 - &gt;做这个 - &gt;做那个”。

无论如何,@ Aaronaught,抱歉向你猛烈抨击这么大的问题,但你显然对此有了比我更多的知识,所以我想尽可能多地挑选你的大脑。

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

{SOME_REALLY_COMPLEX_QUERY_THAT_HAS_TO_BE_IN_RAW_SQL_BECAUSE_LINQ_GENERATES_CRAP_IN_THIS INSTANCE}替换为存储过程,然后让Linq to SQL导入该函数。

然后,您可以直接从数据上下文调用该函数,获取结果并将其传递给视图模型。

我会避免创建一个调用数据上下文的属性。您应该只在需要时从服务或存储库层获取值,而不是将其嵌入到Linq to SQL创建的对象之一中。