在多年滚动我自己的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个存储过程...
这是否可以“开箱即用”,或者这是我需要为自己编写代码的东西?
答案 0 :(得分:3)
这通常是我们所谓的子集合,它们可以被急切加载或延迟加载。阅读这些:
答案 1 :(得分:2)
它使用部分类。您可以将自己的“Notes”属性添加到Person类,并在其GETter函数中初始化它。这比每次加载人员记录时填充注释要好。
答案 2 :(得分:0)
我相信你可以或多或少地开箱即用,虽然我没有尝试过 - 我不使用LINQ存储过程。您需要做的是更改插入/删除/更新方法,使用运行时来使用存储过程。然后,您将在两个实体表之间创建一个关联,这将在Person类上创建Notes的EntitySet,在Notes类上创建Person的EntityRef。您可以将其设置为自动加载或使用延迟加载。
据我所知,唯一棘手的问题是从使用运行时生成的方法到使用存储过程的变化。我相信你必须将它们作为方法添加到数据上下文中(通过在设计器中从服务器资源管理器中删除它),然后才能使用它们。