代码之家  ›  专栏  ›  技术社区  ›  Josh

在实体框架4中使用带有额外参数的存储过程的策略

  •  4
  • Josh  · 技术社区  · 14 年前

    我有这样一种情况,业务需求要求所有数据访问都是通过存储过程完成的。我之所以选择使用实体框架,是因为我知道存储过程支持在4.0中得到了很大的改进。

    但是,我有一组过程,其中包括一些额外的参数(用户名、原因代码等),这些参数将用于过程中的额外逻辑。这是一个很常见的情况,所以我惊讶的是英孚使它难以置信地难以实现这一点。

    如我所见,我唯一的选择是:

    1. 在数据库中创建一个查询基础表的视图,并包含带有空值的额外列名。
    2. 处理savechanges事件,或重写上下文中的savechanges方法并手动处理其中的函数调用。

    选项1 在我当前的项目中是不可能的,尽管这是最简单的。

    选项2 是一项令人难以置信的工作。ef的全部目的是为了避免我不得不编写乏味乏味的数据访问代码,而这些代码很容易出错。让我们看看这里涉及的潜在工作量:

    1. 为需要此信息的每个实体和每个必需的修改操作(插入、更新、删除)创建函数导入。
    2. 创建一些保存所有信息的公共类型,并通过部分类将其应用于每个实体。
    3. 为每个实体的每个方法编写一个映射函数(3*n) 请注意,这还包括获取更新和删除的原始值
    4. 重写savechanges方法以检查每个实体,查看它是否是正确的ifoo接口,检查实体的状态,然后为该实体类型调用适当的方法。

    我错过什么了吗????为什么这样一个常见的场景会如此难以执行?

    我知道有人可能认为我可以编写一个T4模板来为我生成所有这些代码,但这让我回到了一个观点,那就是没有实际价值的冗长的样板代码。只需简单地说:

    “Yo EF!我在叫一个程序!我知道我在做什么,我想把这些额外的价值加在资本中?”

    好奇者的额外信息:

    • 我正在将自我跟踪实体模板与WCF一起使用
    • 附加参数不存在于可由实体链接到的任何位置。
    • 其他参数始终相同
    • 存储过程原样,不能从当前协定中修改它们

    任何帮助或洞察这件事都是最受欢迎的!

    干杯,
    乔希

    2 回复  |  直到 14 年前
        1
  •  1
  •   StriplingWarrior    14 年前

    英孚的关键是拯救我 从不得不麻木地写思想 冗长的数据访问代码 容易出错。

    是的,它的方法是使用t4转换为您编写样板代码。

    我知道有人可能在想我 无法编写T4模板以生成 所有这些代码都是为了我,但那只是 把我带回到正题上来 冗长的样板代码,不添加 真正的价值。

    …这就是为什么利用T4似乎是解决这个问题的一个显而易见的方法。您描述的代码并不比实体框架已经为您生成的代码更繁琐。实际上,您可以更改实体上下文,使.edmx.cs文件首先由您自己的自定义t4模板生成,而不是由Visual Studio的内置转换生成。

    我还不必在实体框架中使用存储过程,因此可能有更好的方法来完成您所描述的工作,但是如果t4方法能够充分解决您的问题,我不会太快地对它进行折扣。

        2
  •  0
  •   poliak    14 年前

    在msdn论坛中有一个关于此主题的线程:
    http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/182c99d0-5fde-4292-b356-4f9a4d86e032/
    我也遇到了同样的问题,我想我只使用CUD过程作为标准函数导入,而不使用savechanges()。