.net 实体框架函数导入:输入参数映射

.net 实体框架函数导入:输入参数映射,.net,entity-framework,c#-4.0,entity-framework-4,entity,.net,Entity Framework,C# 4.0,Entity Framework 4,Entity,实体框架允许轻松地将存储过程的结果映射到实体。我需要的是将实体映射到输入参数,以便 context.SaveUser( user.FirstName, user.LastName, ... ); 我可以这样简单地称之为: context.SaveUser( user ); 我真正想要的是尽可能地隔离可能的模式更改。我只使用EF生成实体和函数导入;与DB的整个交互是通过函数调用执行的。所以,每当用户表发生更改时,我都希望在VisualDesigner中重新生成用户实体,并根据需要更改业务逻辑代

实体框架允许轻松地将存储过程的结果映射到实体。我需要的是将实体映射到输入参数,以便

context.SaveUser( user.FirstName, user.LastName, ... );
我可以这样简单地称之为:

context.SaveUser( user );
我真正想要的是尽可能地隔离可能的模式更改。我只使用EF生成实体和函数导入;与DB的整个交互是通过函数调用执行的。所以,每当用户表发生更改时,我都希望在VisualDesigner中重新生成用户实体,并根据需要更改业务逻辑代码;我不想更改数据访问层。目前,我看不到任何方法可以绕过从数据访问层到EF的依赖于属性集的调用(如我上面发布的调用),这是一个遗憾,因为这些调用可以很容易地与实体类一起重新生成

有没有其他策略可以让我实现同样的目标?我之所以使用这些存储过程,实际上是因为我想完全控制SQL(也许我只是有点偏执,但最终会有成堆的LINQ代码,而很少或根本无法控制实际的SQL,这有点可怕)

这可能吗


谢谢

我认为如果没有一些额外的样板代码,这是不可能的


也许您应该重新考虑当前的访问策略,而不是使用存储过程。然后你就可以随心所欲地去做了。

这是可能的,但方式不同于你试图实现的方式。每个实体都允许将插入、更新和删除操作映射到存储过程。所以,在您的例子中,我假设您需要为Insert和Update操作创建到SaveUser存储过程的映射。映射完成后,每次在实体集中添加或更新实体并请求保存更改时,都会在内部调用存储过程。因此,您将以与不使用存储过程相同的方式使用实体集。查看MSDN:和上的这些文章

编辑:

尝试使用上述方法并以以下方式保存更改:

var user = new User();
FillUser(user); // fill modified data to user entity

using (var context = new MyContext())
{
  context.Users.Attach(user);
  context.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);
  context.SaveChanges(); // This should call your Update stored procedure
}

这是我最初打算做的,但问题是,为了插入、更新或删除一个实体,您需要首先从上下文中获取它。没有要映射到存储过程的选择操作,并且我的用户对数据库没有选择权限。有点搞砸了整个想法…为什么你认为你首先必须从上下文中获取实体?嗯,也许不是每次,但大多数时候-当然,除非我正在创建一个新的实体。典型的场景是从数据库中获取一个实体,对其进行处理,然后可能将其保存回去。每次我试图从数据库中获取实体时,EF都会尝试生成一个SQL查询,但似乎无法让它调用存储过程。我不需要EF来为我做所有的连接,如果有必要的话,我会在SP中做。在应用程序中使用实体之前,您不需要查询DB。您认为使用EF的web应用程序是如何工作的?是的,在某些情况下,查询数据库、获取实体和在附加实体中进行更新更容易,但同样,您可以在代码中创建实体的新实例(无需查询)为实体填充新值,将实体附加到上下文,将实体状态设置为“已修改”并保存更改。我添加了一些代码片段,显示如何强制EF更新之前未由查询加载的实体。