entity-framework-5 – 如何从现有数据库生成POCO代理
我最近切换到Entity Framework 5.现在,我想从现有数据库生成POCO类,我还需要延迟加载和更改跟踪.因此,所有标量属性都应该是虚拟的以及导航属性.
添加新的ADO.Net实体数据模型以.edmx文件和其他一些.cs和.tt文件结尾. 首先,我想知道为什么生成的POCO类默认不符合变更跟踪代理的要求,即标量属性不是虚拟的. 其次,如何生成支持代理的poco类? PS:我接受了Slauma的答案是迄今为止最好和唯一的答案,但我不同意它的第一部分.这是我的论点 Slauma谈到了代理的两个问题:限制和性能: >关于启用代理的实体的限制: 解决方法
建议不要使用更改跟踪代理作为默认更改跟踪策略.它在this blog post中有更详细的解释.实质上,使用更改跟踪代理的主要原因 – 与基于快照的更改跟踪相比,性能更好 – 并不总是得到保证 – 有时甚至更糟 – 并且缺点列表比快照更长基于变更跟踪. 过去,生成POCO实体的T4模板确实将所有属性(包括标量属性)标记为虚拟,并为基于代理的变更跟踪准备实体.由于博客中描述的原因,对于较新的模板已经进行了更改,包括用于EF 5的DbContext Generator,如上面链接的博客文章下面的this comment中所述.现在,只有导航属性被标记为虚拟属性,而不是标量属性,这允许延迟加载但不足以用于更改跟踪代理.
我不知道有任何可用的T4模板,但是很容易修改默认模板以将标量属性标记为虚拟: >在您的项目中,您应该有两个扩展名为.tt的文件:YourModelContainer.tt和YourModelContainer.Context.tt.打开YourModelContainer.tt文件. public string Property(EdmProperty edmProperty) { return string.Format( CultureInfo.InvariantCulture,"{0} {1} {2} {{ {3}get; {4}set; }}",Accessibility.ForProperty(edmProperty),_typeMapper.GetTypeName(edmProperty.TypeUsage),_code.Escape(edmProperty),_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),_code.SpaceAfter(Accessibility.ForSetter(edmProperty))); } 用…更改线 Accessibility.ForProperty(edmProperty), …至… AccessibilityAndVirtual(Accessibility.ForProperty(edmProperty)), 而已. 只是提一下,如果您不熟悉它,但是有第二种可用的数据库优先方法,即Reverse Engineering an existing database to a Code-First model.这种方法根本不使用T4模板,而是创建了Code-First模型,使用Fluent API映射的上下文.如果要自定义和扩展模型类(也可以手动添加虚拟修饰符)并在将来继续使用代码优先工作流(和代码优先迁移)来更新和发展数据库模式,这将非常有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |