代码之家  ›  专栏  ›  技术社区  ›  Bruno Brant

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

  •  2
  • Bruno Brant  · 技术社区  · 14 年前

    我已经做了一些搜索(通过网络等),但到目前为止还没有找到直接回答这个问题的东西:

    有什么事要做吗 L2在访问数据库时使用存储过程?

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


    更新:

    对不起,上面的文字不清楚。不过,我真正想要的是像Update、Insert和Delete这样的“默认方法”来选择。我想通过存储过程完成所有访问,但我想使用 Child Property .

    你不会觉得我疯了吧,我的DAL是用子属性构建的,我用动态SQL通过L2S访问数据库,但是上周客户告诉我所有的数据库访问都必须通过SPROCS完成。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jonathan Bates    14 年前

    我不相信有一个开关或设置,开箱即用,自动映射到使用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
            }
        }
    

    没有什么能阻止您将代码更改为存储过程调用。对于更大的应用程序来说,这将是一种努力,我相信您会从中得到您认为您会得到的好处。

        2
  •  1
  •   shaunmartin    14 年前

    在父实体中使用partial 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();
        }
    }
    
        3
  •  0
  •   Robert Harvey    14 年前

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

    alt text

    在哪里? GetProductsByCategoryName 是存储过程的名称。

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