实体框架:将sproc结果映射到现有EF实体

时间:2011-01-19 19:37:12

标签: c# entity-framework stored-procedures .net-4.0

我正在尝试将EF与现有数据库一起使用。我将Client表引入我的数据模型,让EF创建一个Client实体。我有一个sproc,GetClientSearch,只返回Client表中的15列中的5个,因为该调用只需要这些。

这是我到目前为止所做的:

  • 将sproc添加到Function Imports并将proc设置为映射到Client实体。

  • 当我通过Context执行proc时,我得到“数据读取器与指定的'GAINABSModel.Client'不兼容。该类型的成员'MiddleInitial'在该中没有相应的列同名的数据阅读器。“例外。 (MiddleInitial不是proc中返回的列之一)

  • 我知道我可以创建一个映射到proc的新实体,但我不想为每个必须导入到模型中的proc执行此操作。

  • 鉴于数据库当前正在生产中使用,更改存储过程以映射到我当前的实体可能不是一种选择。

目前正在使用EF 4和VS 2010。

那么,有没有办法将sproc的结果映射到Client实体,即使返回的列与EF实体的属性不是1:1?

2 个答案:

答案 0 :(得分:2)

是的,我在EF的许多痛点之一。

如果你不能修改SP,你最好的选择可能是在现有的SP之上创建“包装”SP。

换句话说,EF服务SP调用现有的SP,并为您不需要的列返回NULL,但实体需要这些。

当然,更好的选择是正确创建实体。

另一种选择是使用ObjectContext.Translate<T>,它基本上在SPROC结果和您提供的实体之间执行L-R。

如果结果集不包含该字段,则该对象上的属性将为null。

这可能是你想要的。

答案 1 :(得分:1)

遇到了同样的问题。假设我在User Table中创建了UserEntity,并且有3个程序。

  1. AuthenticateUser - 在身份验证后从用户表中返回4列
  2. RetriveUser - 从用户表中返回10列
  3. GetUserName - 仅为下拉目的返回UserID和UserName。
  4. 如果我们为每个不同的SP创建不同的实体。由于重复,这会导致糟糕的设计。

    我没有其他方法可以为所有这些SP使用相同的实体。

    总的来说,我不推荐实体框架至少用于生产中的遗留应用程序。(你也不能更新你的Sp。)