【问题标题】:How to make all entities access:internal instead of public in EDMX?如何让所有实体访问:EDMX 中的内部而不是公共?
【发布时间】:2012-03-19 19:26:41
【问题描述】:

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

是否有任何简单的方法可以使 EF 模型生成使用 internal modifer 而不是 public,包括更新时的模型重新生成?

【问题讨论】:

    标签: entity-framework model public entities internal


    【解决方案1】:

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

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

    您也可以选择使用T4模板,在这里您可以直接修改正在生成的访问权限。

    【讨论】:

    • 我知道属性窗口,但它不允许我选择多个实体并同时设置它们的访问修饰符。我必须一件一件地去做。我想我需要看看 T4 模板。
    • 用 XML 编辑器打开 EDMX 文件(它是一个纯 XML 文件)并在那里进行批量替换。 20 秒内完成。
    • 是的,我想要一些更永久的解决方案(修改器不会被代码重新生成替换),但这也没关系。
    • 不会。如果您用 XML 替换它,即使在重新生成模型后它也会保留在那里。这与在模型浏览器窗口中执行此操作相同,只是速度更快。
    【解决方案2】:

    我自己刚刚使用最新版本的 Entity Framework (6.2.0) 完成了这项工作。 在 .tt 文件的第 314 行,我发现了这个:

    public string EntityClassOpening(EntityType entity)
    

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

    【讨论】:

      【解决方案3】:

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

      根据hvd的回答改编:

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

      部分类...

      部分类...

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

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

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

      【讨论】:

        【解决方案4】:

        我希望我的实体容器以及生成的复杂类是内部的。首先,我将“实体容器访问”设置为内部。接下来,我在 itemCollection 变量初始化后在“Model.tt”文件的顶部添加了一个容器变量。我在“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 引导我朝着正确的方向前进。

        【讨论】:

          猜你喜欢
          • 2020-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-11
          • 1970-01-01
          • 2017-11-11
          • 1970-01-01
          • 2011-02-24
          相关资源
          最近更新 更多