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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 引导我朝着正确的方向前进。

【讨论】:

以上是关于如何让所有实体访问:EDMX 中的内部而不是公共?的主要内容,如果未能解决你的问题,请参考以下文章

有没有人将实体框架与代码优先方法与 Edmx 文件混合使用?

实体数据模型(.edmx 文件)是不是与 ORM 无关?

模型中的多个图与一个大的.EDMX与多个.EDMX

自我跟踪实体的目的是啥?

私有的嵌套类(内部或静态)是不是可能具有具有公共访问权限的方法?

同一个 .net 解决方案中的多个 edmx