我想我的实体框架模型生成实体与internal
访问修饰符,而不是public
。我在库中使用EF模型,我只想从外部访问一个类(某些控制器)。如何让所有的实体访问:在EDMX内部而不是公开?
有什么简单的方法可以让EF模型生成使用internal
修改而不是public
,包括更新时的模型更新?
我想我的实体框架模型生成实体与internal
访问修饰符,而不是public
。我在库中使用EF模型,我只想从外部访问一个类(某些控制器)。如何让所有的实体访问:在EDMX内部而不是公开?
有什么简单的方法可以让EF模型生成使用internal
修改而不是public
,包括更新时的模型更新?
这很像我在similar question上得到的那种。但在你的情况下,你想要自定义类的访问修饰符,而不是ObjectContext。
HVD的回答后改编:
设计者有一个选项“添加代码生成项目”。如果你使用这个,你会得到几个选择。我使用的是“ADO.NET自我跟踪实体生成器”,但同样的方法适用于所有人。选择此项将向模型文件添加两个模板文件(Model.tt和Model.Context.tt),您可以根据自己的需要自由修改它们。对于你问的修改,你会在或接近行37.更改
<#= Accessibility.ForType(实体)#> <#= code.SpaceAfter找到一个代码生成实体类(code.AbstractOption(实体))#>部分类...
到
部分类...
对于复杂类型,下面还有类似的行:在“部分”之前也删除零件。
这将一次设置所有类型的访问修饰符,包括将来的类型。要定制各种类型,最好使用模型浏览器。
您必须将模型本身的属性“实体容器访问”设置为internal,否则将生成具有不兼容访问修饰符的成员。
当然,在模型浏览器窗口中选择> EntityTypes
,并在你的类型在属性窗口中访问修饰符设置。您还应该在EntityContainer> EntitySets中修改set的修饰符,就好像该类型是内部的,该集合至少也应该是内部的(默认为public)。
可以选择使用T4模板,在这里你可以直接修改正在生成的修改访问。
我希望我的实体容器以及生成的复杂类都是内部的。首先,我将“实体容器访问”设置为内部。接下来,在初始化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为我带来正确的方向。
我知道属性窗口,但它不允许我选择多个实体并同时设置其访问修饰符。我必须一个接一个地做。我想我需要看看T4模板。 – 2012-03-01 12:36:38
用XML编辑器(这是一个普通的XML文件)打开EDMX文件并在那里进行批量替换。在20秒内完成。 – 2012-03-01 20:45:08
是的,我正在寻求一些更持久的解决方案(修改器不会被代码更新所替代),但也没关系。 – 2012-03-01 21:28:23