【问题标题】:Can linq2sql do this without a lot of custom code?linq2sql 可以在没有大量自定义代码的情况下做到这一点吗?
【发布时间】:2009-01-13 21:04:12
【问题描述】:

在多年滚动我自己的 SQL Server 数据库访问例程之后,我刚刚开始涉足 Linq2sql 项目。

在我花太多时间弄清楚如何使 linq2sql 的行为像我以前的自定义代码一样之前,我想检查以确保它不是已经“内置”的行为,我可以通过设置设计师中的关系...

非常简单的例子:

我有两个表:Person 和 Notes,具有一对多的关系(1 Person, many notes),由 Person.ID->Note.PersonID 链接。

我有一个存储过程(所有数据访问都通过 SP 完成,我计划继续这样做),这使 Link2SQL 对我来说更有用。

sp_PersonGet(@ID int) 返回人员记录,sp_PersonNotesGet(@PersonID) 返回此人员的一组相关注释。

到目前为止一切顺利,我有一个对象:

Dim myPerson As Person = db.PersonGet(pnID).Single

我可以访问我的字段:myPerson.Name、myPerson.Phone 等。


我也可以做一个

将 myNotes 调暗为 Notes = db.PersonNotesGet(pnID)

要获得一组笔记,我可以像这样遍历这个列表:

对于 myNotes 中的每个 N 作为注释 ( 做点什么) 下一个

这一切都很好......但是......我更喜欢的是,如果我打电话:

myPerson = db.PersonGet(pnID)

我还得到了一个 myPerson.Notes 集合,我可以通过它进行迭代。

对于 myPerson.Notes 中的每个 N 作为注释 ( 做点什么) 下一个

基本上,每次创建 Person 记录时,Linq2SQl 都需要调用 2 个存储过程...

这是可行的“开箱即用”,还是我需要自己编写代码?

【问题讨论】:

    标签: asp.net vb.net linq-to-sql orm


    【解决方案1】:
    【解决方案2】:

    它使用部分类。您可以将自己的“Notes”属性添加到您的 Person 类中,并在它的 GETter 函数中对其进行初始化。这比每次加载人员记录时都填充注释要好。

    【讨论】:

      【解决方案3】:

      我相信你可以或多或少地做到这一点,虽然我没有尝试过——我不使用 LINQ 的存储过程。您需要做的是将插入/删除/更新方法从使用运行时更改为使用存储过程。然后,您将在两个实体表之间创建一个关联,该关联将在 Person 类上创建 Notes 的 EntitySet,在 Notes 类上创建 Person 的 EntityRef。您可以将其设置为自动加载或使用延迟加载。

      据我所知,唯一棘手的地方是从使用运行时生成的方法到使用存储过程的变化。我相信您必须将它们作为方法添加到数据上下文中(通过将其从设计器中的服务器资源管理器中拖放到您的表中),然后才能使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 2019-01-18
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多