【发布时间】:2012-03-19 19:26:41
【问题描述】:
我希望我的实体框架模型生成具有 internal 访问修饰符的实体,而不是 public。我在库中使用 EF 模型,我只希望从外部访问一个类(一些控制器)。
是否有任何简单的方法可以使 EF 模型生成使用 internal modifer 而不是 public,包括更新时的模型重新生成?
【问题讨论】:
标签: entity-framework model public entities internal
我希望我的实体框架模型生成具有 internal 访问修饰符的实体,而不是 public。我在库中使用 EF 模型,我只希望从外部访问一个类(一些控制器)。
是否有任何简单的方法可以使 EF 模型生成使用 internal modifer 而不是 public,包括更新时的模型重新生成?
【问题讨论】:
标签: entity-framework model public entities internal
当然,在模型浏览器窗口中选择 > EntityTypes
并在属性窗口访问修饰符中设置您的类型。您还应该在 EntityContainer > EntitySets 中修改 set 的修饰符,就好像类型是内部的一样,集合也应该至少是内部的(默认公共)。
您也可以选择使用T4模板,在这里您可以直接修改正在生成的访问权限。
【讨论】:
我自己刚刚使用最新版本的 Entity Framework (6.2.0) 完成了这项工作。 在 .tt 文件的第 314 行,我发现了这个:
public string EntityClassOpening(EntityType entity)
在第 319 行,我只是将其更改为表示内部的字符串。运行该工具,现在我的所有实体都是内部的。
【讨论】:
这很像我在similar question 上得到的答案。但在您的情况下,您希望自定义类的访问修饰符,而不是 ObjectContext。
根据hvd的回答改编:
设计器有一个选项“添加代码生成项”。如果你使用它,你会得到几个选项。我正在使用“ADO.NET 自跟踪实体生成器”,但同样的方式适用于所有这些。选择此选项会将两个模板文件(Model.tt 和 Model.Context.tt)添加到您的项目中,您可以随意修改它们。对于您询问的修改,您会在第 37 行或附近找到为您的实体类生成的代码。更改
部分类...
到
部分类...
对于复杂类型,下面还有一条类似的行:也擦除“部分”之前的部分。
这将立即为所有类型设置访问修饰符,包括未来的类型。要自定义单个类型,您最好使用模型浏览器。
您还必须将模型本身的属性“实体容器访问”设置为内部,否则将生成具有不兼容访问修饰符的成员。
【讨论】:
我希望我的实体容器以及生成的复杂类是内部的。首先,我将“实体容器访问”设置为内部。接下来,我在 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 引导我朝着正确的方向前进。
【讨论】: