强制LINQ在访问数据库时使用存储过程

时间:2010-11-22 22:32:15

标签: linq-to-sql stored-procedures

我已经完成了一些搜索(通过网络和SO),但到目前为止一直无法找到直接回答此问题的内容:

无论如何强制 L2S在访问数据库时使用存储过程?

这与简单地使用SPROC和L2S不同:事情是,我依靠LINQ来延迟加载元素,然后通过生成的“子属性”访问。如果我使用SPROC检索一个表的元素,然后映射到LINQ中的实体,然后访问子属性,我相信LINQ将使用动态sql从数据库中检索寄存器,这违背了我的目的。 / p>


更新

很抱歉,如果上面的文字不清楚。我真正想要的是像“更新,插入和删除”的“默认方法”,然而,选择。我希望每次访问都通过SPROC完成,但我想使用Child Property

所以你不认为我疯了,问题是我的DAL是使用子属性构建的,而我是通过L2S使用动态SQL访问数据库,但上周客户端告诉我所有数据库访问必须通过SPROCS完成。

3 个答案:

答案 0 :(得分:3)

我不相信开箱即用的开关或设置会自动映射到您描述的方式使用t sprocs。但现在有理由不能改变生成的DBML文件来执行您想要的操作。如果我有两个相关的表,一个Catalog表和CatalogItem表,Linq2SQL生成器自然会在Catalog上给我一个CatalogItems的属性,代码如下:

private EntitySet<shelf_myndr_Previews_CatalogItem> _shelf_myndr_Previews_CatalogItems;

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="CatalogItem", Storage="_CatalogItems", ThisKey="Id", OtherKey="CatalogId")]
public EntitySet<CatalogItem> CatalogItems
    {
        get
        {
            return this._CatalogItems;
                            //replace this line with a sproc call that ultimately
                            //returns the expected type
        }
        set
        {
            this._CatalogItems.Assign(value);
                            //replace this line with a sproc call that ultimately
                            //does a save operation
        }
    }

没有什么可以阻止你将代码更改为sproc调用。对于大型应用程序来说,这是一些努力,我相信你会从中获得你认为可以获得的好处。

答案 1 :(得分:1)

如何在父实体中使用部分OnLoaded()方法加载子实体?这样可以避免弄乱生成的代码。当然它不再是一个懒惰的负载,但它是一种简单的方法。

例如:

public partial class Supplier
{
    public List<Product> Products { get; set; }

    partial void OnLoaded()
    {
        // GetProductsBySupplierId is the SP dragged into your dbml designer
        Products = dataContext.GetProductsBySupplierId(this.Id).ToList();
    }
}

答案 2 :(得分:0)

以这种方式调用存储过程:

alt text

其中GetProductsByCategoryName是存储过程的名称。

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

相关问题