没有很多自定义代码,linq2sql可以做到这一点吗?

时间:2009-01-13 21:04:13

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

在多年滚动我自己的SQL Server数据库访问例程后,只需将我的脚趾浸入Linq2sql项目中。

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

很简单的例子:

我有两个表:Person和Notes,具有1对多关系(1个人,多个音符),由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等。


我也可以做一个

Dim myNotes As Notes = db.PersonNotesGet(pnID) 

获取一组注释,我可以通过这个列表迭代:

For Each N As Note In myNotes
  ( do something)
Next

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

  myPerson = db.PersonGet(pnID)

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

For Each N As Note In myPerson.Notes
  ( do something)
Next

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

这是否可以“开箱即用”,或者这是我需要为自己编写代码的东西?

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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