【问题标题】:Stored procedures with joined data in entity framework实体框架中具有连接数据的存储过程
【发布时间】:2012-09-23 14:49:56
【问题描述】:

我们目前有一个具有相当大数据库的系统,并且存储过程用于 CUD 和查询。数据集用于从 SP 查询中检索结果。

现在我们正在考虑使用实体框架针对同一数据库开发另一个项目。在查询数据库时,存储过程通常会执行大量的连接,以收集一些不在目标表中的字段,而是从连接表中收集客户端以某种方式需要的数据。使用 DataSet 时,SP 返回的所有字段都包含在 DataTable 中。所以DataTable实际上并不匹配目标数据库表。

在 EF 中处理这种情况的正确方法是什么?在创建我的模型时,实体被映射到每个表,如上所述,这些表有时仅与 SP 的结果匹配。我可以将 SP 查询结果的“附加”字段作为属性添加到实体类中,并让它们由查询填充,但在涉及特定实体类型的 CUD 时排除这些属性?似乎 EF 方式,如果通过 LINQ to Entities 而不是 SP 进行查询,将拥有与连接实体具有关系属性的实体实例,以便通过导航关系属性来使用这些“附加”属性?

【问题讨论】:

    标签: entity-framework stored-procedures join


    【解决方案1】:

    您可以定义任意的复杂类型(只是为您生成的一个类,以匹配存储过程返回的列和数据类型)作为实体框架中存储过程的返回类型(从第 4 版及更新的版本开始)——这里没问题。

    请参阅Stored Procedures in the Entity Framework,详细了解与在 Entity Framework 中使用存储过程相关的所有内容。

    【讨论】:

    • 但是复杂类型不能作为可跟踪实体与 EF 交互,对吧?我需要能够对实体执行 CUD 操作,我只需要它们携带一些未被跟踪的额外信息。
    • @nobba:复杂类型是一个“容器”类,用于保存从存储过程返回的数据。它们本身并不是实体 - 但它们绝对可以与现有的 EF 实体交互!为什么你认为他们不能??
    • 抱歉,我好像把复杂类型和别的东西混在一起了。最好的方法是将源自其他表的“额外属性”映射到复杂类型,然后将其添加到主实体?因为我不想只得到复杂类型。
    • @nobba:如果您有一个返回这些额外值的存储过程,那么 EF 将创建一个复杂类型,其中包含您的所有实体属性以及您的额外字段。您可以使用 AutoMapper 之类的东西轻松地将这些复杂类型映射到您已经拥有的实际实体类型(为自己省去很多无聊和无脑的左右赋值语句)
    • 是的,我在其他一些场景中使用 Auto-Mapper,所以这是可能的。我仍然不确定您的意思是说复杂类型在 CUD 操作中是否可以像普通实体类型一样工作?如果 SP 返回一个复杂类型,如果我删除它并在上下文中保存更改会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 2012-02-27
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多