如何让所有实体访问:EDMX中的内部而不是公共?

时间:2012-03-01 09:47:01

标签: entity-framework model public entities internal

我希望我的实体框架模型生成具有 internal 访问修饰符的实体,而不是 public 。我在库中使用EF模型,我只想从外部访问一个类(一些控制器)。

有没有简单的方法让EF模型生成使用internal modifer而不是public,包括更新时的模型重新生成?

4 个答案:

答案 0 :(得分:3)

当然,在模型浏览器窗口中选择> EntityTypes

Model Browser

并在“属性”窗口中设置的类型访问修饰符。您还应该在EntityContainer中修改> Entity设置set的修饰符,就好像类型是内部的一样,该set也应该至少是内部的(默认为public)。

选择性地,您可以使用T4模板,您可以直接修改正在生成的访问修改。

答案 1 :(得分:1)

这非常像我在similar question上获得的答案。但在您的情况下,您希望自定义类的访问修饰符,而不是ObjectContext。

在hvd回答之后改编:

设计师有一个选项“添加代码生成项”。如果你使用它,你会得到几个选择。我正在使用“ADO.NET自我跟踪实体生成器”,但同样适用于所有这些。选择此项会将两个模板文件(Model.tt和Model.Context.tt)添加到项目中,您可以根据需要随意修改。对于您所询问的修改,您将在第37行或附近找到实体类的代码生成。更改

  

<#= Accessibility.ForType(实体)#> <#= code.SpaceAfter(code.AbstractOption(entity))#> partial class ...

  

部分班......

对于复杂类型,下面还有一个类似的行:也在“部分”之前擦除部分。

这将立即为所有类型设置访问修饰符,包括未来类型。要自定义单个类型,最好使用模型浏览器。

您必须将模型本身的“实体容器访问”属性设置为内部,否则将生成具有不兼容访问修饰符的成员。

答案 2 :(得分:0)

我希望我的实体容器以及生成的复杂类都是内部的。首先,我设置了"实体容器访问"到内部。接下来,我在" Model.tt"的顶部添加了一个容器变量。 itemCollection变量初始化后的文件。我在" Model.Context.tt"中找到了容器变量代码。文件。

    var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
    var container = itemCollection.OfType<EntityContainer>().FirstOrDefault();

接下来我改变了

    <#=Accessibility.ForType(complex)#> partial class <#=code.Escape(complex)#>

    <#=Accessibility.ForType(container)#> partial class <#=code.Escape(complex)#>

我选择以这种方式修改代码,这样我就可以使复杂的类容器访问修饰符与容器访问修饰符保持同步。

感谢Gert Arnold带领我朝着正确的方向前进。

答案 3 :(得分:0)

我自己使用最新版本的Entity Framework(6.2.0)进行了介绍。 在.tt文件的第314行,我发现了这一点:

public string EntityClassOpening(EntityType entity)

在第319行,我只是将其更改为说明内部的字符串。运行该工具,现在我所有的实体都在内部。