如何让所有实体访问: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 文件混合使用?