实体框架允许轻松地将存储过程的结果映射到实体。我需要的是将实体映射到输入参数,以便代替
context.SaveUser( user.FirstName, user.LastName, ... );
我可以简单地称之为:
context.SaveUser( user );
我真正想要的是尽可能地隔离可能的架构更改。我只使用EF来生成实体和函数导入;与DB的整个交互是通过函数调用执行的。因此,每当User表发生更改时,我都希望在可视化设计器中重新生成User实体并根据需要更改业务逻辑代码;我不想更改数据访问层。目前,我没有看到任何关于从数据访问层到EF的属性集依赖调用(就像我上面发布的那样),这是一种耻辱,因为这些可以很容易地与实体类一起重新生成。
还有其他策略可以让我达到同样的目标吗?我使用这些存储过程的原因实际上是因为我想要完全控制SQL(也许我只是偏执狂,但是最终需要很少或根本没有控制实际的LINQ代码是有点可怕的SQL)。
这样的事情可能吗?
谢谢
答案 0 :(得分:0)
如果没有一些额外的样板代码,我认为不可能。
也许您应该重新考虑当前的访问策略,而不是使用存储过程。然后你就可以像想要的那样去做。
答案 1 :(得分:0)
这是可能的,但与您尝试实现它的方式不同。每个实体都允许将Insert,Update和Delete操作映射到存储过程。因此,在您的情况下,我假设您需要为InsertUup存储过程创建插入和更新操作的映射。完成映射时,每次在实体集中添加或更新实体时都会在内部调用存储过程,并请求SaveChanges。因此,您将使用与没有存储过程相同的方式使用实体集。在MSDN上查看这些文章:How to和Walkthrough。
修改强>
尝试使用上述方法并以这种方式保存更改:
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
}