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

问题描述 投票:5回答:1

因此,在我的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生成的几个表/对象。但是,如果我打开一个“产品” ...
.net linq entity-framework-4 linq-to-entities
1个回答
9
投票
传递ref变量用于更改包含引用的变量。但是由于您没有在DataContext dbase方法中更改GetPByRole引用,因此将其作为ref传递是没有用的,只会使其他开发人员感到困惑。也许您误解了值类型和引用类型。引用类型(例如DataContext)始终通过引用传递,通过方法调用传递它不会生成对象本身的新副本,而只是引用的副本(32位或64位值)。

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

© www.soinside.com 2019 - 2024. All rights reserved.