我正在尝试将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?
答案 0 :(得分:2)
是的,我在EF的许多痛点之一。
如果你不能修改SP,你最好的选择可能是在现有的SP之上创建“包装”SP。
换句话说,EF服务SP调用现有的SP,并为您不需要的列返回NULL,但实体需要这些。
当然,更好的选择是正确创建实体。
另一种选择是使用ObjectContext.Translate<T>
,它基本上在SPROC结果和您提供的实体之间执行L-R。
如果结果集不包含该字段,则该对象上的属性将为null。
这可能是你想要的。
答案 1 :(得分:1)
遇到了同样的问题。假设我在User Table中创建了UserEntity,并且有3个程序。
如果我们为每个不同的SP创建不同的实体。由于重复,这会导致糟糕的设计。
我没有其他方法可以为所有这些SP使用相同的实体。
总的来说,我不推荐实体框架至少用于生产中的遗留应用程序。(你也不能更新你的Sp。)