2011-01-19 66 views
3

我试图将EF与现有的数据库一起使用。我将一张客户表引入我的数据模型,并让EF创建一个客户实体。我有一个sproc,GetClientSearch,它只返回客户端表中15列中的5个,这是该调用所需的全部内容。实体框架:将sproc结果映射到现有的EF实体

这是我到目前为止已经完成:

  • 新增的存储过程,以函数导入和设置PROC映射到客户端实体。

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

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

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

目前使用EF 4和VS 2010

那么,有没有一种方法来映射存储过程到客户企业的业绩,即使返回的列不是1:1与性能EF实体的?

回答

2

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

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

换句话说,EF服务的SP调用了现有的SP,并且为不需要的列返回NULL,但是实体需要它们。

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

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

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

这可能是你想要的。

+0

WOW!我的帖子进行了多少个月不采取行动,并在同一天看到两个帖子。谢谢(你的)信息。我将不得不在我的下一个项目上尝试一下,因为我现在所做的一个项目已经无法完成改变。这听起来完全像我所需要的。 – jonnyb 2011-06-06 16:05:22

1

我遇到了同样的问题。假设我有用户表创建UserEntity并有3个过程。

  1. 的authenticateUser - 从用户表返回4列认证
  2. RetriveUser之后 - 只为下拉目的返回用户名和用户名 - 从用户表
  3. GetUserName返回10列。

如果我们为每个不同的SP创建不同的实体。由于重复,会导致设计不好。

我没有其他方式使用相同的实体所有这些SP的。

总体来说,我不建议实体框架ATLEAST在生产中的遗留应用程序。(你不能同时更新您的SP的。)