将DataContext对象作为'ref'参数传递的缺点吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将DataContext对象作为'ref'参数传递的缺点吗?相关的知识,希望对你有一定的参考价值。

因此,在我的EF4项目中,我打开了DataContext文件本身的部分类,以及由DataContext生成的几个表/对象。但是,如果我打开“ Products”类作为部分类,则(据我所知)没有从产品到产生它的DataContext类的直接链接。

public partial class Product 
{
    public DataContext GetContext() 
    {
        return this.DataContext; 
        // FAILS!!! No connection from 'this' to DataContext
        // makes sense because "Product" isn't REALLY derived from DataContext
        //...but still, I want this to work!
    }
}

但是在部分产品类中,我当然希望能够直接查询数据库,而且我真的很希望能够仅初始化一个DataContext实例并将其用于我的aspx.cs页面查询,以及从aspx.cs页面调用的部分类执行的查询。

因此,到目前为止,我的解决方案是将DataContext的实例作为“ ref”参数传递给需要在数据库中四处摸索的我的局部类的方法。这是局部类:

public partial class Complaint
{
    public IEnumerable<Person> GetPByRole(InvestigationRole roleEnum, ref DataContext dbase)
    {
        var role = dbase.GetRole(roleEnum);
        return this.PeopleOnInvestigations
                   .Where(x => x.InvestigationRoleID == 1)
                   .Select(x => x.Person);
     }
}

[[因此,将我的DataContext对象作为ref参数传递给需要通过此连接访问数据库的任何局部类方法的弊端?缺点之一是,一旦将它作为ref传入,我可以从这些局部类中为它添加新实体,然后在asp.cs页面上进行SaveChanges调用后,所有更改(从aspx和局部类方法)都将执行。 >

因此,在我的EF4项目中,我打开了DataContext文件本身的部分类,以及由DataContext生成的几个表/对象。但是,如果我打开一个“产品” ...
答案
传递ref变量用于更改包含引用的变量。但是由于您没有在DataContext dbase方法中更改GetPByRole引用,因此将其作为ref传递是没有用的,只会使其他开发人员感到困惑。也许您误解了值类型和引用类型。引用类型(例如DataContext)始终通过引用传递,通过方法调用传递它不会生成对象本身的新副本,而只是引用的副本(32位或64位值)。

您正在混合职责。您的Product类是一个实体,但是您似乎正在其上实现所有类型的数据检索方法。这将很快变成一团糟。给系统中的每个班级一个责任。 Person类的职责是当一个人。

以上是关于将DataContext对象作为'ref'参数传递的缺点吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ref 作为组件对象中的道具传递?

在 WPF 中使用 DataContext 作为 CommandParameter

使用 DataContext 从 LINQ 查询中填充 DataTable 的最快方法

如何将 ref 作为道具传递:[Vue 警告]:无效的道具:道具“containerRef”的类型检查失败。预期对象,得到 HTMLDivElement?

c#传递引用对象作为参数的时候就没有必要用ref关键字,对吗

DataContext 和绑定 self 作为 RelativeSource