【问题标题】:ObjectContext public in debug mode, internal in release modeObjectContext 在调试模式下是公共的,在发布模式下是内部的
【发布时间】:2012-03-16 18:06:39
【问题描述】:

有没有一种简单的方法可以让 ObjectContext 在调试模式下公开,在发布模式下设为内部?

使用 Linqpad 连接到 ObjectContext 以进行快速测试和查询非常方便,因此出于开发目的,我希望它是公开的。但是我不想考虑将同样的便利部署给一些聪明的客户时会产生什么后果。

【问题讨论】:

  • 智能客户可以使用Reflector,例如。并不是说我同意在生产环境中公开 ObjectContext - 只是在内部使用它可能无法解决您的问题。

标签: c# .net entity-framework access-modifiers ef-model-first


【解决方案1】:

正如评论中提到的,这可能没有任何实际用途,但是:

#if DEBUG
public
#endif
class YourContext : ObjectContext
{
    ...
}

在处理从 .edmx 文件生成的ObjectContext 时,您需要自定义 C# 文件的生成方式。默认是不可定制的,但设计者有一个选项“添加代码生成项”。如果你使用它,你会得到几个选项。我正在使用“ADO.NET 自跟踪实体生成器”,但同样的方式适用于所有这些。选择此选项会将两个模板文件(Model.tt 和 Model.Context.tt)添加到您的项目中,您可以随意修改它们。对于您询问的修改,您将在 Model.Context.tt 文件中找到 <#=Accessibility.ForType(container)#> partial class。您可以更新它以使其读取

#if DEBUG
<#=Accessibility.ForType(container)#>
#endif
partial class

【讨论】:

  • 对不起,我应该提到我指的是模型优先(添加了标签)。所以我正在处理一个生成的 edmx 文件。我不能添加部分类,因为它不能有不同的访问修饰符。无论如何+1,因为它可以在代码优先的情况下工作。
  • @GertArnold 您可以使用 T4 模板自定义生成的类,并修改该模板以在结果中包含您想要的任何内容,包括预处理器指令。
  • 我对那个(还)不太熟悉。你能参考一些来源吗?
  • @GertArnold 没有来源,但简单解释一下:在 EDMX 设计器中,右键单击,选择“添加代码生成项”。然后你会有几个选择,我将使用“ADO.NET Self-Tracking Entity Generator”。在新创建的“Model.Context.tt”中,您会找到&lt;#=Accessibility.ForType(container)#&gt; partial class。您可以将&lt;#=Accessibility.ForType(container)#&gt; 部分放在#if DEBUG#endif 之间。 (我不确定您是否需要安装任何额外的东西来获取这些模板。)
  • 更好,而且还有效!也许您可以将此添加到您的答案中,我很乐意将其标记为已接受。
【解决方案2】:

Preprocessor directive?

# if(DEBUG)
        public ObjectContext _context;
# else
        internal ObjectContext _context;
#endif

【讨论】:

  • 不,我指的是类本身,而不是我使用的每个实例。
  • 正如@hvd 在他的回答中所说,这同样适用于课堂。
猜你喜欢
  • 2016-03-19
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多