我已经完成了一些搜索(通过网络和SO),但到目前为止一直无法找到直接回答此问题的内容:
无论如何强制 L2S在访问数据库时使用存储过程?
这与简单地使用SPROC和L2S不同:事情是,我依靠LINQ来延迟加载元素,然后通过生成的“子属性”访问。如果我使用SPROC检索一个表的元素,然后映射到LINQ中的实体,然后访问子属性,我相信LINQ将使用动态sql从数据库中检索寄存器,这违背了我的目的。 / p>
更新
很抱歉,如果上面的文字不清楚。我真正想要的是像“更新,插入和删除”的“默认方法”,然而,选择。我希望每次访问都通过SPROC完成,但我想使用Child Property
。
所以你不认为我疯了,问题是我的DAL是使用子属性构建的,而我是通过L2S使用动态SQL访问数据库,但上周客户端告诉我所有数据库访问必须通过SPROCS完成。
答案 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)
以这种方式调用存储过程:
其中GetProductsByCategoryName
是存储过程的名称。