首先closuresEF代码的CTP5的ProxyCreationEnabled有什么缺点

我的WCF服务可以从代码优先模型返回类的唯一方法是使用下面的代码将ProxyCreationEnable设置为false

 ((IObjectContextAdapter)MyDb).ObjectContext.ContextOptions.ProxyCreationEnable = false; 

这样做的负面后果是什么? 一个好处是,我可以至less得到这些dynamictypes序列化,所以他们可以通过使用WCF的电线发送。

dynamic代理用于更改跟踪和延迟加载。 当WCF尝试序列化对象时,相关的上下文通常是closures和处置的,但是导航属性的序列化会自动触发延迟加载(在closures的上下文中)=>exception。

如果closures延迟加载,则需要对所有要使用的导航属性(包括ObjectQuery)使用预先加载。 跟踪更改不能通过WCF工作,它只适用于修改连接到ObjectContext的实体。

如果DbContext.Configuration.ProxyCreationEnabled设置为false ,除非在父对象上调用Include方法,否则DbContext不会为某个父对象加载子对象。 将DbContext.Configuration.LazyLoadingEnabled设置为truefalse将不会影响其行为。

如果DbContext.Configuration.ProxyCreationEnabled设置为true ,子对象将被自动加载,并且DbContext.Configuration.LazyLoadingEnabled值将控制何时加载子对象。

当您使用EF时,它将为您的课程默认创build一个代理。 解决scheme可以在DbContext类的构造函数中添加此行。 你的数据模型inheritance自DbContext类,所以你可以像这样编辑你的模型:

  public yourDataModelEntities() : base("name=yourDataModelEntities") { base.Configuration.ProxyCreationEnabled = false; } 

这个类是在你的EF.edmx然后在yourmodel.Context.tt然后yourmodel.Context.cs

(使用Visual Studio 2013或更高版本)

为了避免每次从数据库刷新模型或者以其他方式触发代码重build时在EF模型中编辑类构造函数,正确的位置在T4代码文件中负责实际上是创build模型代码。 几年前,当我了解如何实际创build类和属性的基本机制时,我还遇到了dynamic属性的其他问题。 T4! 奇迹是多么的奇怪:D语法起初可能有点吓人,所以读一下语法是明智的。 在进行更改时非常关注也是一个好主意:-)

所以! 如果你看看你的模型,你的.edmx文件下有一个.tt文件。 这个.tt(T4)文件是实际创build模型类的脚本。 脚本将在您每次构build模型时自动运行,或者在模型编辑器中进行一些更改。

假设您的模型描述符被命名为Model1.edmx 。 你会在它下面的树中有一个名为Model1.Context.tt的文件。 您还将看到一个Model1.Context.cs文件。 这显然是您的上下文的实际代码文件。 但是这个文件是正在运行的.tt脚本文件的结果 ! 它是完全dynamic创build的。 所以不知道编辑它。

打开.tt文件,您将看到如下所示的内容:

 <#@ template language="C#" debug="false" hostspecific="true"#> <#@ include file="EF6.Utility.CS.ttinclude"#><#@ output extension=".cs"#><# const string inputFile = @"Model1.edmx"; var textTransform = DynamicTextTransformation.Create(this); .. .. 

另外50个左右,构造函数代码正在编写脚本。

 using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; <# if (container.FunctionImports.Any()) { #> using System.Data.Entity.Core.Objects; using System.Linq; <# } #> <#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext { public <#=code.Escape(container)#>() : base("name=<#=container.Name#>") { base.Configuration.ProxyCreationEnabled = false; <# if (!loader.IsLazyLoadingEnabled(container)) { #> this.Configuration.LazyLoadingEnabled = false; <# } 

我已经添加了属性base.Configuration.ProxyCreationEnabled = false; 所以这将是构造函数中的第一行。

保存您的文件,然后打开Model1.Context.cs文件以查看生成的代码。 如果要强制运行模板脚本,请select菜单

构build – Tranform所有的T4模板

很容易知道,如果你在T4代码中犯了一个错误,因为.cs文件根本就没有生成,或者如果你在编辑器中打开它,会有明显的错误。