如何让EF 6生成的实体所有属性均带有virtual修饰符?
给EF6自动生成的实体属性添加virtual修饰符
我之前也折腾过这个需求,其实不用怕TT模板的复杂逻辑,找对生成属性的代码块改就行,步骤很清晰:
第一步:打开你的实体TT模板文件
找到项目里和EDMX模型对应的那个.tt文件(比如你的模型叫MyModel.edmx,对应的就是MyModel.tt),双击打开它。第二步:定位到属性生成的代码段
在TT文件里搜索类似WriteProperty的方法,或者直接找遍历实体属性的循环代码(通常会有foreach (var property in entity.Properties)这样的语句)。你会看到一行生成属性定义的代码,大概长这样:<#=Accessibility.ForProperty(property)#> <#=typeUsage#> <#=code.Escape(property)#> { get; set; }第三步:修改代码添加virtual
把原来的<#=Accessibility.ForProperty(property)#>替换成public virtual(因为你希望所有属性都是public且带virtual),修改后的代码变成:public virtual <#=typeUsage#> <#=code.Escape(property)#> { get; set; }如果你需要保留原有的访问修饰符逻辑(比如个别属性是protected),也可以改成:
<#=Accessibility.ForProperty(property)#> virtual <#=typeUsage#> <#=code.Escape(property)#> { get; set; }第四步:重新生成实体类
保存TT文件,然后右键点击这个TT文件,选择「运行自定义工具」,EF就会重新生成所有实体类,这时你会发现所有属性都带上了virtual修饰符。
小提醒:EF6默认生成的导航属性已经是
virtual了(为了支持延迟加载),这个修改主要是给标量属性加上virtual,如果是为了让EF的代理类能拦截标量属性的访问,这个设置是有效的。
内容的提问来源于stack exchange,提问作者Forsaiken
相关产品推荐
相关产品推荐

