<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_LingzhiSun's Blog</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/60904/rss</id><updated>2011-10-31T01:32:24Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/60904/rss"/><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/06/13/EFPowerTool_2.html</id><title type="text">Entity Framework Code First使用者的福音 --- EF Power Tool使用记之二（问题探究）</title><summary type="text">Entity Framework Power Tool使用中所碰到的问题和原因2则。微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-06-13T09:21:00Z</published><updated>2011-06-13T09:21:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/06/13/EFPowerTool_2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/06/13/EFPowerTool_2.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html"&gt;&lt;strong&gt;上次&lt;/strong&gt;&lt;/a&gt;为大家介绍&lt;strong&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/"&gt;EF Power Tool&lt;/a&gt;&lt;/strong&gt;之后，不少朋友在使用的时候碰到了一些问题曾像我提问。我自己以及同事在使用这个工具时，其实也碰到了一些问题。今天我将和大家一起分享其中2个问题以及相应的原因。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. EF Power Tool帮助我们生成Code First POCO class时为何只生成了部分代码，甚至所使用的程序集都没有导入？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241657583327.png" width="548" height="561" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241658227687.png" width="483" height="689" alt="" /&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;在输入了相应的数据库Named Instance和登录信息后，EF Power Tool开始为我们创建相应的class。此时使用SQL Server Profiler同时观察SQL Server在本地的Named Instance和SQL Express Instance，我们会发现一系列数据库访问在Named Instance上执行了。&lt;/p&gt;  &lt;p&gt; 1) 首先是这样一个查询。以上篇文章中的Parent和Child类为例子，会返回这些用户级别表字段的数据。其中每个字段分别表示&lt;/p&gt;  &lt;p&gt;C1: 每个字段在表中的序号&lt;/p&gt;  &lt;p&gt;CatalogName: 数据库名&lt;/p&gt;  &lt;p&gt;SchemaName：表的schema名&lt;/p&gt;  &lt;p&gt;Name：表名&lt;/p&gt;  &lt;p&gt;C2：字段名&lt;/p&gt;  &lt;p&gt;C3：是否为NULL&lt;/p&gt;  &lt;p&gt;C4：字段类型&lt;/p&gt;  &lt;p&gt;C5：字段最大长度&lt;/p&gt;  &lt;p&gt;C6：字段精度&lt;/p&gt;  &lt;p&gt;C7：DateTime的精度&lt;/p&gt;  &lt;p&gt;C8：字段刻度&lt;/p&gt;  &lt;p&gt;C9：是否为Identity&lt;/p&gt;  &lt;p&gt;C10：是否为数据库自动生成&lt;/p&gt;  &lt;p&gt;C11：是否为主键&lt;/p&gt;  &lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/ColumnData.JPG" width="696" height="112" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;[Project6].[C2] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;[Project6].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;[Project6].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName], &lt;br /&gt;[Project6].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;[Project6].[C1] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;[Project6].[C3] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;[Project6].[C4] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;[Project6].[C5] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;[Project6].[C6] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;[Project6].[C7] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;[Project6].[C8] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;[Project6].[C9] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;[Project6].[C10] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10], &lt;br /&gt;[Project6].[C11] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C11]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; ( &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;    [Extent1].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;    [Extent1].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName], &lt;br /&gt;    [Extent1].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;    [UnionAll1].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;    [UnionAll1].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;    [UnionAll1].[IsNullable] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;    [UnionAll1].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;    [UnionAll1].[MaxLength] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;    [UnionAll1].[&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;    [UnionAll1].[DateTimePrecision] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;    [UnionAll1].[Scale] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;    [UnionAll1].[IsIdentity] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;    [UnionAll1].[IsStoreGenerated] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10], &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; ([Project5].[C2] &lt;span style="color: #0000ff"&gt;IS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; [Project5].[C2] &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C11]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;   (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]&lt;br /&gt;        ,   TABLE_CATALOG [CatalogName]&lt;br /&gt;        ,   TABLE_SCHEMA [SchemaName]&lt;br /&gt;        ,   TABLE_NAME    [Name]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.TABLES&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent1]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [Extent2].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent2].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent2].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;        [Extent2].[IsNullable] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsNullable], &lt;br /&gt;        [Extent2].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;        [Extent2].[MaxLength] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [MaxLength], &lt;br /&gt;        [Extent2].[&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;], &lt;br /&gt;        [Extent2].[DateTimePrecision] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [DateTimePrecision], &lt;br /&gt;        [Extent2].[Scale] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Scale], &lt;br /&gt;        [Extent2].[IsIdentity] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsIdentity], &lt;br /&gt;        [Extent2].[IsStoreGenerated] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsStoreGenerated], &lt;br /&gt;        0 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent2].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)[DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          , c.COLUMN_DEFAULT &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.TABLES t &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = t.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = t.TABLE_SCHEMA   &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = t.TABLE_NAME       &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          t.TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent2]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [Extent3].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent3].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent3].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;        [Extent3].[IsNullable] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsNullable], &lt;br /&gt;        [Extent3].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;        [Extent3].[MaxLength] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [MaxLength], &lt;br /&gt;        [Extent3].[&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;], &lt;br /&gt;        [Extent3].[DateTimePrecision] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [DateTimePrecision], &lt;br /&gt;        [Extent3].[Scale] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Scale], &lt;br /&gt;        [Extent3].[IsIdentity] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsIdentity], &lt;br /&gt;        [Extent3].[IsStoreGenerated] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsStoreGenerated], &lt;br /&gt;        6 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent3].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          ,   c.COLUMN_DEFAULT [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.VIEWS v &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = v.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = v.TABLE_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = v.TABLE_NAME&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (v.TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; v.TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent3]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll1] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (0 = [UnionAll1].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent1].[Id] = [UnionAll1].[ParentId])&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [UnionAll2].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(1 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(tc.CONSTRAINT_SCHEMA) + quotename(tc.CONSTRAINT_NAME) [Id]&lt;br /&gt;        , quotename(tc.TABLE_SCHEMA) + quotename(tc.TABLE_NAME) [ParentId]&lt;br /&gt;        ,   tc.CONSTRAINT_NAME [Name]&lt;br /&gt;        ,   tc.CONSTRAINT_TYPE [ConstraintType]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; tc.IS_DEFERRABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsDeferrable]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; tc.INITIALLY_DEFERRED &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsInitiallyDeferred]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; tc.TABLE_NAME &lt;span style="color: #0000ff"&gt;IS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent4]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            7 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent5].[ConstraintId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ConstraintId], &lt;br /&gt;            [Extent6].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(CONSTRAINT_SCHEMA) + quotename(CONSTRAINT_NAME) [ConstraintId]&lt;br /&gt;        ,   quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) + quotename(COLUMN_NAME) [ColumnId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.KEY_COLUMN_USAGE&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent5]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)[DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          , c.COLUMN_DEFAULT &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.TABLES t &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = t.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = t.TABLE_SCHEMA   &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = t.TABLE_NAME       &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          t.TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent6] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [Extent6].[Id] = [Extent5].[ColumnId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            11 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent7].[ConstraintId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ConstraintId], &lt;br /&gt;            [Extent8].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(1))     [ConstraintId]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;)) [ColumnId]  &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; 1=2&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent7]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          ,   c.COLUMN_DEFAULT [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.VIEWS v &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = v.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = v.TABLE_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = v.TABLE_NAME&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (v.TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; v.TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent8] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [Extent8].[Id] = [Extent7].[ColumnId]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll2] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (7 = [UnionAll2].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent4].[Id] = [UnionAll2].[ConstraintId])&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; [Extent4].[ConstraintType] = &lt;span style="color: #006080"&gt;'PRIMARY KEY'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Project5] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [UnionAll1].[Id] = [Project5].[C1]&lt;br /&gt;)  &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Project6]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;ORDER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BY&lt;/span&gt; [Project6].[SchemaName] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project6].[Name] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project6].[C2] ASC&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 2) 然后这个查询返回系统级表的字段信息。&lt;/p&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;  &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;[Project6].[C2] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;[Project6].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;[Project6].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName], &lt;br /&gt;[Project6].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;[Project6].[C1] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;[Project6].[C3] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;[Project6].[C4] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;[Project6].[C5] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;[Project6].[C6] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;[Project6].[C7] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;[Project6].[C8] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;[Project6].[C9] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;[Project6].[C10] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10], &lt;br /&gt;[Project6].[C11] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C11]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; ( &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;    [Extent1].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;    [Extent1].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName], &lt;br /&gt;    [Extent1].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;    [UnionAll1].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;    [UnionAll1].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;    [UnionAll1].[IsNullable] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;    [UnionAll1].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;    [UnionAll1].[MaxLength] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;    [UnionAll1].[&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;    [UnionAll1].[DateTimePrecision] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;    [UnionAll1].[Scale] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;    [UnionAll1].[IsIdentity] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;    [UnionAll1].[IsStoreGenerated] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10], &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; ([Project5].[C2] &lt;span style="color: #0000ff"&gt;IS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; [Project5].[C2] &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C11]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;   (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]&lt;br /&gt;        ,   TABLE_CATALOG             [CatalogName]&lt;br /&gt;        ,   TABLE_SCHEMA              [SchemaName]&lt;br /&gt;        ,   TABLE_NAME                [Name]&lt;br /&gt;        ,   VIEW_DEFINITION           [ViewDefinition]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; IS_UPDATABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsUpdatable]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.VIEWS&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent1]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [Extent2].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent2].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent2].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;        [Extent2].[IsNullable] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsNullable], &lt;br /&gt;        [Extent2].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;        [Extent2].[MaxLength] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [MaxLength], &lt;br /&gt;        [Extent2].[&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;], &lt;br /&gt;        [Extent2].[DateTimePrecision] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [DateTimePrecision], &lt;br /&gt;        [Extent2].[Scale] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Scale], &lt;br /&gt;        [Extent2].[IsIdentity] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsIdentity], &lt;br /&gt;        [Extent2].[IsStoreGenerated] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsStoreGenerated], &lt;br /&gt;        4 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent2].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)[DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          , c.COLUMN_DEFAULT &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.TABLES t &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = t.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = t.TABLE_SCHEMA   &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = t.TABLE_NAME       &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          t.TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent2]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [Extent3].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent3].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent3].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;        [Extent3].[IsNullable] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsNullable], &lt;br /&gt;        [Extent3].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;        [Extent3].[MaxLength] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [MaxLength], &lt;br /&gt;        [Extent3].[&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;], &lt;br /&gt;        [Extent3].[DateTimePrecision] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [DateTimePrecision], &lt;br /&gt;        [Extent3].[Scale] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Scale], &lt;br /&gt;        [Extent3].[IsIdentity] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsIdentity], &lt;br /&gt;        [Extent3].[IsStoreGenerated] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsStoreGenerated], &lt;br /&gt;        0 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent3].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          ,   c.COLUMN_DEFAULT [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.VIEWS v &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = v.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = v.TABLE_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = v.TABLE_NAME&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (v.TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; v.TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent3]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll1] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (0 = [UnionAll1].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent1].[Id] = [UnionAll1].[ParentId])&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [UnionAll2].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(1 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(1))   [Id]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(256)) [ParentId]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(256)) [Name]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(256)) [ConstraintType]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsDeferrable]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsInitiallyDeferred]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;)) [Expression]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(11))  [UpdateRule]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(11))  [DeleteRule]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; 1=2&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent4]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            10 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent5].[ConstraintId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ConstraintId], &lt;br /&gt;            [Extent6].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(CONSTRAINT_SCHEMA) + quotename(CONSTRAINT_NAME) [ConstraintId]&lt;br /&gt;        ,   quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) + quotename(COLUMN_NAME) [ColumnId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.KEY_COLUMN_USAGE&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent5]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)[DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          , c.COLUMN_DEFAULT &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.TABLES t &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = t.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = t.TABLE_SCHEMA   &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = t.TABLE_NAME       &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          t.TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent6] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [Extent6].[Id] = [Extent5].[ColumnId]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            7 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent7].[ConstraintId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ConstraintId], &lt;br /&gt;            [Extent8].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(1))     [ConstraintId]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;)) [ColumnId]  &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; 1=2&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent7]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          ,   c.COLUMN_DEFAULT [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.VIEWS v &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = v.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = v.TABLE_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = v.TABLE_NAME&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (v.TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; v.TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent8] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [Extent8].[Id] = [Extent7].[ColumnId]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll2] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (7 = [UnionAll2].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent4].[Id] = [UnionAll2].[ConstraintId])&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; [Extent4].[ConstraintType] = &lt;span style="color: #006080"&gt;'PRIMARY KEY'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Project5] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [UnionAll1].[Id] = [Project5].[C1]&lt;br /&gt;)  &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Project6]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;ORDER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BY&lt;/span&gt; [Project6].[SchemaName] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project6].[Name] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project6].[C2] ASC&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 3) 此查询返回数据库中所有的外键关系。以Parent和Child为例子，返回这样一个表格：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/FKData.JPG" width="686" height="37" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;  &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;[Project11].[C1] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;[Project11].[C5] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;[Project11].[C6] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;[Project11].[C4] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;[Project11].[C2] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;[Project11].[C8] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;[Project11].[C9] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;[Project11].[C7] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;[Project11].[C3] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;[Project11].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;[Project11].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;[Project11].[C10] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; ( &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;    [Extent1].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;    [Extent2].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;    [Join5].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;    [Join5].[Name1] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;    [Join5].[Name2] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;    [UnionAll4].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;    [UnionAll4].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;    [UnionAll4].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;    [UnionAll5].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;    [UnionAll5].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;    [UnionAll5].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; ([Extent1].[DeleteRule] = &lt;span style="color: #006080"&gt;'CASCADE'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(1 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; ([Extent1].[DeleteRule] &amp;lt;&amp;gt; &lt;span style="color: #006080"&gt;'CASCADE'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;     (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(rc.CONSTRAINT_SCHEMA) + quotename(rc.CONSTRAINT_NAME) [Id]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(rc.UPDATE_RULE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(11)) [UpdateRule]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(rc.DELETE_RULE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(11)) [DeleteRule]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent1]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(tc.CONSTRAINT_SCHEMA) + quotename(tc.CONSTRAINT_NAME) [Id]&lt;br /&gt;        , quotename(tc.TABLE_SCHEMA) + quotename(tc.TABLE_NAME) [ParentId]&lt;br /&gt;        ,   tc.CONSTRAINT_NAME [Name]&lt;br /&gt;        ,   tc.CONSTRAINT_TYPE [ConstraintType]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; tc.IS_DEFERRABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsDeferrable]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; tc.INITIALLY_DEFERRED &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsInitiallyDeferred]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; tc.TABLE_NAME &lt;span style="color: #0000ff"&gt;IS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent2] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [Extent1].[Id] = [Extent2].[Id]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; [UnionAll1].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], [UnionAll1].[C1] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C11], [UnionAll1].[ConstraintId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ConstraintId], [Join2].[Id1], [UnionAll2].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name1], [UnionAll2].[C2] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C21], [UnionAll2].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId1], [UnionAll3].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name2]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;     (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            [Extent3].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;            0 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent3].[ConstraintId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ConstraintId], &lt;br /&gt;            6 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;            [Extent3].[FromColumnId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [FromColumnId], &lt;br /&gt;            6 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;            [Extent3].[ToColumnId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ToColumnId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(FC.CONSTRAINT_SCHEMA) + quotename(FC.CONSTRAINT_NAME) + quotename(&lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(FC.ORDINAL_POSITION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(30))) [Id]&lt;br /&gt;        ,   quotename(PC.TABLE_SCHEMA) + quotename(PC.TABLE_NAME) + quotename(PC.COLUMN_NAME) [ToColumnId]&lt;br /&gt;        ,   quotename(FC.TABLE_SCHEMA) + quotename(FC.TABLE_NAME) + quotename(FC.COLUMN_NAME) [FromColumnId]&lt;br /&gt;        ,   quotename(FC.CONSTRAINT_SCHEMA) + quotename(FC.CONSTRAINT_NAME) [ConstraintId]&lt;br /&gt;        ,   FC.ORDINAL_POSITION [Ordinal]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; RC&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.KEY_COLUMN_USAGE &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; PC &lt;span style="color: #008000"&gt;/* PRIMARY KEY COLS*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;       RC.UNIQUE_CONSTRAINT_SCHEMA = PC.CONSTRAINT_SCHEMA&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;      RC.UNIQUE_CONSTRAINT_NAME    = PC.CONSTRAINT_NAME&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.KEY_COLUMN_USAGE &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; FC &lt;span style="color: #008000"&gt;/* FOREIGN KEY COLS*/&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;       RC.CONSTRAINT_SCHEMA = FC.CONSTRAINT_SCHEMA&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;      RC.CONSTRAINT_NAME    = FC.CONSTRAINT_NAME&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;      PC.ORDINAL_POSITION = FC.ORDINAL_POSITION&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent3]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            [Extent4].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;            9 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent4].[ConstraintId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ConstraintId], &lt;br /&gt;            10 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;            [Extent4].[FromColumnId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [FromColumnId], &lt;br /&gt;            10 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;            [Extent4].[ToColumnId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ToColumnId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(1))    [Id]&lt;br /&gt;        ,  &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;)) [ToColumnId]&lt;br /&gt;        ,  &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;)) [FromColumnId]&lt;br /&gt;        ,  &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(1))   [ConstraintId]&lt;br /&gt;        ,  0 [Ordinal]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; 1=2&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent4]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll1]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; [Extent5].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id1]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(rc.CONSTRAINT_SCHEMA) + quotename(rc.CONSTRAINT_NAME) [Id]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(rc.UPDATE_RULE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(11)) [UpdateRule]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(rc.DELETE_RULE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(11)) [DeleteRule]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent5]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(tc.CONSTRAINT_SCHEMA) + quotename(tc.CONSTRAINT_NAME) [Id]&lt;br /&gt;        , quotename(tc.TABLE_SCHEMA) + quotename(tc.TABLE_NAME) [ParentId]&lt;br /&gt;        ,   tc.CONSTRAINT_NAME [Name]&lt;br /&gt;        ,   tc.CONSTRAINT_TYPE [ConstraintType]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; tc.IS_DEFERRABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsDeferrable]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; tc.INITIALLY_DEFERRED &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsInitiallyDeferred]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt; tc.TABLE_NAME &lt;span style="color: #0000ff"&gt;IS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent6] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [Extent5].[Id] = [Extent6].[Id] ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Join2] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; ([UnionAll1].[C1] = 0) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([UnionAll1].[ConstraintId] = [Join2].[Id1])&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            6 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent7].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;            [Extent7].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;            3 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;            [Extent7].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)[DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          , c.COLUMN_DEFAULT &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.TABLES t &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = t.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = t.TABLE_SCHEMA   &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = t.TABLE_NAME       &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          t.TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent7]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            10 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent8].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;            [Extent8].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;            12 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;            [Extent8].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          ,   c.COLUMN_DEFAULT [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.VIEWS v &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = v.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = v.TABLE_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = v.TABLE_NAME&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (v.TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; v.TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent8]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll2] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; ([UnionAll1].[C3] = [UnionAll2].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([UnionAll1].[ToColumnId] = [UnionAll2].[Id])&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            6 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent9].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;            [Extent9].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)[DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          , c.COLUMN_DEFAULT &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.TABLES t &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = t.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = t.TABLE_SCHEMA   &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = t.TABLE_NAME       &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          t.TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent9]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            10 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent10].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;            [Extent10].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;          quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id]&lt;br /&gt;          ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId]&lt;br /&gt;          ,   c.COLUMN_NAME   [Name]&lt;br /&gt;          ,   c.ORDINAL_POSITION [Ordinal]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; c.IS_NULLABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsNullable]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;          c.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;          c.DATA_TYPE&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [TypeName]&lt;br /&gt;          ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(c.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;          ,   c.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;          ,   c.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;          ,   c.COLLATION_NAME [CollationName]&lt;br /&gt;          ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;          ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;          ,   c.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsIdentity'&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsIdentity]&lt;br /&gt;          ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + &lt;span style="color: #006080"&gt;'.'&lt;/span&gt; + quotename(c.TABLE_NAME)), c.COLUMN_NAME, &lt;span style="color: #006080"&gt;'IsComputed'&lt;/span&gt; ) | &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; c.DATA_TYPE = &lt;span style="color: #006080"&gt;'timestamp'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsStoreGenerated]&lt;br /&gt;          ,   c.COLUMN_DEFAULT [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.COLUMNS c&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;&lt;br /&gt;          INFORMATION_SCHEMA.VIEWS v &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;          c.TABLE_CATALOG = v.TABLE_CATALOG &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_SCHEMA = v.TABLE_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;          c.TABLE_NAME = v.TABLE_NAME&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (v.TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; v.TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;          &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent10]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll3] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; ([UnionAll1].[C2] = [UnionAll3].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([UnionAll1].[FromColumnId] = [UnionAll3].[Id]) ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Join5] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (0 = [Join5].[C11]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent1].[Id] = [Join5].[ConstraintId]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Join5].[Id1] = [Extent1].[Id])&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        3 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent11].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent11].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent11].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;        [Extent11].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]&lt;br /&gt;        ,   TABLE_CATALOG [CatalogName]&lt;br /&gt;        ,   TABLE_SCHEMA [SchemaName]&lt;br /&gt;        ,   TABLE_NAME    [Name]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.TABLES&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent11]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        12 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent12].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent12].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent12].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;        [Extent12].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]&lt;br /&gt;        ,   TABLE_CATALOG             [CatalogName]&lt;br /&gt;        ,   TABLE_SCHEMA              [SchemaName]&lt;br /&gt;        ,   TABLE_NAME                [Name]&lt;br /&gt;        ,   VIEW_DEFINITION           [ViewDefinition]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; IS_UPDATABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsUpdatable]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.VIEWS&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent12]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll4] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; ([Join5].[C21] = [UnionAll4].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Join5].[ParentId1] = [UnionAll4].[Id])&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        3 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent13].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent13].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent13].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;        [Extent13].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]&lt;br /&gt;        ,   TABLE_CATALOG [CatalogName]&lt;br /&gt;        ,   TABLE_SCHEMA [SchemaName]&lt;br /&gt;        ,   TABLE_NAME    [Name]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.TABLES&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        TABLE_TYPE = &lt;span style="color: #006080"&gt;'BASE TABLE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent13]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        12 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent14].[Id] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Id], &lt;br /&gt;        [Extent14].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent14].[CatalogName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [CatalogName], &lt;br /&gt;        [Extent14].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]&lt;br /&gt;        ,   TABLE_CATALOG             [CatalogName]&lt;br /&gt;        ,   TABLE_SCHEMA              [SchemaName]&lt;br /&gt;        ,   TABLE_NAME                [Name]&lt;br /&gt;        ,   VIEW_DEFINITION           [ViewDefinition]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; IS_UPDATABLE &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'YES'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 1 &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) [IsUpdatable]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.VIEWS&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (TABLE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; TABLE_NAME &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;(&lt;span style="color: #006080"&gt;'syssegments'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'sysconstraints'&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent14]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll5] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (3 = [UnionAll5].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent2].[ParentId] = [UnionAll5].[Id])&lt;br /&gt;)  &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Project11]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;ORDER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BY&lt;/span&gt; [Project11].[Name] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project11].[Id] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project11].[C1] ASC&lt;/div&gt;&lt;p&gt;&amp;nbsp; 4) 最后这个查询返回数据库中存储过程和函数的相关信息。&lt;/p&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;  &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;[Project7].[C12] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;[Project7].[C1] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;[Project7].[C2] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;[Project7].[C3] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;[Project7].[C4] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;[Project7].[C5] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;[Project7].[C6] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;[Project7].[C7] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;[Project7].[C8] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;[Project7].[C9] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10], &lt;br /&gt;[Project7].[C10] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C11]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; ( &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;    [UnionAll3].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;    [UnionAll3].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;    [UnionAll3].[ReturnTypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;    [UnionAll3].[IsAggregate] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;    [UnionAll3].[C1] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;    [UnionAll3].[IsBuiltIn] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;    [UnionAll3].[IsNiladic] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;    [UnionAll3].[C2] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;    [UnionAll3].[C3] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9], &lt;br /&gt;    [UnionAll3].[C4] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C10], &lt;br /&gt;    [UnionAll3].[C5] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C11], &lt;br /&gt;    1 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C12]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [Extent1].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName], &lt;br /&gt;        [Extent1].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        [Extent1].[ReturnTypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ReturnTypeName], &lt;br /&gt;        [Extent1].[IsAggregate] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsAggregate], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(1 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        [Extent1].[IsBuiltIn] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsBuiltIn], &lt;br /&gt;        [Extent1].[IsNiladic] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [IsNiladic], &lt;br /&gt;        [UnionAll1].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;        [UnionAll1].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;        [UnionAll1].[Mode] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;        [UnionAll1].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(SPECIFIC_SCHEMA) + quotename(SPECIFIC_NAME) [Id]&lt;br /&gt;        , SPECIFIC_CATALOG         [CatalogName]&lt;br /&gt;        , SPECIFIC_SCHEMA          [SchemaName]&lt;br /&gt;        , SPECIFIC_NAME            [Name]&lt;br /&gt;        ,   &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;        CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;        DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;        DATA_TYPE&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; [ReturnTypeName]&lt;br /&gt;        , CHARACTER_MAXIMUM_LENGTH            [ReturnMaxLength]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)  [ReturnPrecision]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [ReturnDateTimePrecision]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;)      [ReturnScale]&lt;br /&gt;        , COLLATION_CATALOG        [ReturnCollationCatalog]&lt;br /&gt;        , COLLATION_SCHEMA         [ReturnCollationSchema]&lt;br /&gt;        , COLLATION_NAME           [ReturnCollationName]&lt;br /&gt;        , CHARACTER_SET_CATALOG    [ReturnCharacterSetCatalog]&lt;br /&gt;        , CHARACTER_SET_SCHEMA     [ReturnCharacterSetSchema]&lt;br /&gt;        , CHARACTER_SET_NAME       [ReturnCharacterSetName]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt;        [ReturnIsMultiSet]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsAggregate]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsBuiltIn]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsNiladic]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.ROUTINES&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (ROUTINE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ROUTINE_NAME &lt;span style="color: #0000ff"&gt;LIKE&lt;/span&gt; &lt;span style="color: #006080"&gt;'dt[_]%'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; (DATA_TYPE != &lt;span style="color: #006080"&gt;'TABLE'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OR&lt;/span&gt; DATA_TYPE &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ROUTINE_TYPE = &lt;span style="color: #006080"&gt;'FUNCTION'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent1]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            [Extent2].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;            [Extent2].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;            [Extent2].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;            [Extent2].[Mode] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Mode], &lt;br /&gt;            0 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent2].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME) + quotename(f.PARAMETER_NAME) [Id]&lt;br /&gt;        , quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME)                              [ParentId]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #008000"&gt;-- trim off the @ symbol&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; f.PARAMETER_NAME &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(f.PARAMETER_NAME, 2, LEN(f.PARAMETER_NAME) )&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;   [Name]&lt;br /&gt;        , f.ORDINAL_POSITION [Ordinal]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; f.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;        f.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;        f.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;        f.DATA_TYPE&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; [TypeName]&lt;br /&gt;        , f.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(f.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(f.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(f.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;        , f.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;        , f.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;        , f.COLLATION_NAME [CollationName]&lt;br /&gt;        , f.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;        , f.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;        , f.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;        , f.PARAMETER_MODE   [Mode]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;))  [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.&lt;span style="color: #0000ff"&gt;PARAMETERS&lt;/span&gt; f&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; INFORMATION_SCHEMA.ROUTINES r &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;        f.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        f.SPECIFIC_NAME = r.SPECIFIC_NAME &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        r.ROUTINE_TYPE = &lt;span style="color: #006080"&gt;'FUNCTION'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        f.IS_RESULT = &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent2]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            [Extent3].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;            [Extent3].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;            [Extent3].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;            [Extent3].[Mode] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Mode], &lt;br /&gt;            6 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent3].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME) + quotename(p.PARAMETER_NAME) [Id]&lt;br /&gt;        , quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME)                              [ParentId]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #008000"&gt;-- trim off the @ symbol&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; p.PARAMETER_NAME &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(p.PARAMETER_NAME, 2, LEN(p.PARAMETER_NAME) )&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;   [Name]&lt;br /&gt;        , p.ORDINAL_POSITION [Ordinal]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; p.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;        p.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;        p.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;        p.DATA_TYPE&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; [TypeName]&lt;br /&gt;        , p.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(p.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(p.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(p.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;        , p.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;        , p.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;        , p.COLLATION_NAME [CollationName]&lt;br /&gt;        , p.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;        , p.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;        , p.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;        , p.PARAMETER_MODE   [Mode]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;)) [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.&lt;span style="color: #0000ff"&gt;PARAMETERS&lt;/span&gt; p&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; INFORMATION_SCHEMA.ROUTINES r &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;        p.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        p.SPECIFIC_NAME = r.SPECIFIC_NAME &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        r.ROUTINE_TYPE = &lt;span style="color: #006080"&gt;'PROCEDURE'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        p.IS_RESULT = &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent3]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll1] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (0 = [UnionAll1].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent1].[Id] = [UnionAll1].[ParentId])&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;        [Extent4].[SchemaName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [SchemaName], &lt;br /&gt;        [Extent4].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(1)) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C2], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C3], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C4], &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;cast&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C5], &lt;br /&gt;        [UnionAll2].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C6], &lt;br /&gt;        [UnionAll2].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C7], &lt;br /&gt;        [UnionAll2].[Mode] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C8], &lt;br /&gt;        [UnionAll2].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C9]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;  (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(SPECIFIC_SCHEMA) + quotename(SPECIFIC_NAME) [Id]&lt;br /&gt;        , SPECIFIC_CATALOG         [CatalogName]&lt;br /&gt;        , SPECIFIC_SCHEMA          [SchemaName]&lt;br /&gt;        , SPECIFIC_NAME            [Name]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.ROUTINES&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; (ROUTINE_SCHEMA = &lt;span style="color: #006080"&gt;'dbo'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ROUTINE_NAME &lt;span style="color: #0000ff"&gt;LIKE&lt;/span&gt; &lt;span style="color: #006080"&gt;'dt[_]%'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(SERVERPROPERTY(&lt;span style="color: #006080"&gt;'productversion'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;(20)),1,1) = 8)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; (DATA_TYPE != &lt;span style="color: #006080"&gt;'TABLE'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OR&lt;/span&gt; DATA_TYPE &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ROUTINE_TYPE = &lt;span style="color: #006080"&gt;'PROCEDURE'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent4]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OUTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt;  (&lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            [Extent5].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;            [Extent5].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;            [Extent5].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;            [Extent5].[Mode] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Mode], &lt;br /&gt;            0 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent5].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME) + quotename(f.PARAMETER_NAME) [Id]&lt;br /&gt;        , quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME)                              [ParentId]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #008000"&gt;-- trim off the @ symbol&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; f.PARAMETER_NAME &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(f.PARAMETER_NAME, 2, LEN(f.PARAMETER_NAME) )&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;   [Name]&lt;br /&gt;        , f.ORDINAL_POSITION [Ordinal]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; f.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;        f.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;        f.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;        f.DATA_TYPE&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; [TypeName]&lt;br /&gt;        , f.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(f.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(f.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(f.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;        , f.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;        , f.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;        , f.COLLATION_NAME [CollationName]&lt;br /&gt;        , f.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;        , f.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;        , f.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;        , f.PARAMETER_MODE   [Mode]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;))  [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.&lt;span style="color: #0000ff"&gt;PARAMETERS&lt;/span&gt; f&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; INFORMATION_SCHEMA.ROUTINES r &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;        f.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        f.SPECIFIC_NAME = r.SPECIFIC_NAME &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        r.ROUTINE_TYPE = &lt;span style="color: #006080"&gt;'FUNCTION'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        f.IS_RESULT = &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent5]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;UNION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; &lt;br /&gt;            [Extent6].[Name] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Name], &lt;br /&gt;            [Extent6].[Ordinal] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Ordinal], &lt;br /&gt;            [Extent6].[TypeName] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [TypeName], &lt;br /&gt;            [Extent6].[Mode] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Mode], &lt;br /&gt;            6 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [C1], &lt;br /&gt;            [Extent6].[ParentId] &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [ParentId]&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; (&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt;&lt;br /&gt;        quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME) + quotename(p.PARAMETER_NAME) [Id]&lt;br /&gt;        , quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME)                              [ParentId]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; &lt;span style="color: #008000"&gt;-- trim off the @ symbol&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; p.PARAMETER_NAME &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;(p.PARAMETER_NAME, 2, LEN(p.PARAMETER_NAME) )&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;   [Name]&lt;br /&gt;        , p.ORDINAL_POSITION [Ordinal]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHEN&lt;/span&gt; p.DATA_TYPE &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (&lt;span style="color: #006080"&gt;'varchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'nvarchar'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'varbinary'&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;and&lt;/span&gt;&lt;br /&gt;        p.CHARACTER_MAXIMUM_LENGTH = -1 &lt;span style="color: #0000ff"&gt;THEN&lt;/span&gt;&lt;br /&gt;        p.DATA_TYPE + &lt;span style="color: #006080"&gt;'(max)'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;&lt;br /&gt;        p.DATA_TYPE&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;END&lt;/span&gt; [TypeName]&lt;br /&gt;        , p.CHARACTER_MAXIMUM_LENGTH [MaxLength]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(p.NUMERIC_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [&lt;span style="color: #0000ff"&gt;Precision&lt;/span&gt;]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(p.DATETIME_PRECISION &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [DateTimePrecision]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(p.NUMERIC_SCALE &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt;) [Scale]&lt;br /&gt;        , p.COLLATION_CATALOG [CollationCatalog]&lt;br /&gt;        , p.COLLATION_SCHEMA [CollationSchema]&lt;br /&gt;        , p.COLLATION_NAME [CollationName]&lt;br /&gt;        , p.CHARACTER_SET_CATALOG [CharacterSetCatalog]&lt;br /&gt;        , p.CHARACTER_SET_SCHEMA [CharacterSetSchema]&lt;br /&gt;        , p.CHARACTER_SET_NAME [CharacterSetName]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(0 &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bit&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; [IsMultiSet]&lt;br /&gt;        , p.PARAMETER_MODE   [Mode]&lt;br /&gt;        , &lt;span style="color: #0000ff"&gt;CAST&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;)) [&lt;span style="color: #0000ff"&gt;Default&lt;/span&gt;]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt;&lt;br /&gt;        INFORMATION_SCHEMA.&lt;span style="color: #0000ff"&gt;PARAMETERS&lt;/span&gt; p&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;JOIN&lt;/span&gt; INFORMATION_SCHEMA.ROUTINES r &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt;&lt;br /&gt;        p.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        p.SPECIFIC_NAME = r.SPECIFIC_NAME &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;br /&gt;        r.ROUTINE_TYPE = &lt;span style="color: #006080"&gt;'PROCEDURE'&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;WHERE&lt;/span&gt;&lt;br /&gt;        p.IS_RESULT = &lt;span style="color: #006080"&gt;'NO'&lt;/span&gt;&lt;br /&gt;      ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Extent6]) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll2] &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; (6 = [UnionAll2].[C1]) &lt;span style="color: #0000ff"&gt;AND&lt;/span&gt; ([Extent4].[Id] = [UnionAll2].[ParentId])) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [UnionAll3]&lt;br /&gt;)  &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; [Project7]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;ORDER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BY&lt;/span&gt; [Project7].[C1] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project7].[C2] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;, [Project7].[C11] ASC&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;通过以上四个查询所得到的信息，EF Power Tool便可以地生成对应的class。具体的实现就比较复杂了，今天就不详细探究。（之后会为大家奉上）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看到这里大家是否想到这样一个问题？如果我们访问数据库所使用的用户没有执行这些查询的权限会怎么样呢？这样生成的代码自然会很不完全。许多代码只生成了一部分，有些命名空间和程序集都没有被自动导入。这就产生了类似上一篇文章中，用户@Zero0420所碰到的问题：&amp;#8220;为什么我老是生成的时候，DbModelBuilder 找不到命名空间？&amp;#8221;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;经过一番研究与试验后，我们使用的用户对于所要操作的数据库必须要符合以下权限中的一个：&lt;strong&gt;db_datareader&lt;/strong&gt;, &lt;strong&gt;db_datawriter&lt;/strong&gt;, &lt;strong&gt;db_ddladmin&lt;/strong&gt;, &lt;strong&gt;db_owner&lt;/strong&gt;以及&lt;strong&gt;db_securityadmin&lt;/strong&gt;。有关这些权限更详细的说明，请参看：&lt;a title="http://msdn.microsoft.com/en-us/library/ms189121(v=SQL.105).aspx" href="http://msdn.microsoft.com/en-us/library/ms189121(v=SQL.105).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms189121(v=SQL.105).aspx&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/UserPermissions.jpg" width="1275" height="849" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. EF Power Tool在生成Entity Data Model (.edmx和.XML)、Entity Data Model DDL以及生成Generated View的代码时为何会报ProviderIncompatibleException的错误？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;接下来我们讨论另一个EF Power Tool的问题。在使用它为我们生成Entity Data Model (.edmx和.XML)、Entity Data Model DDL以及生成Generated View的代码时，&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241704136004.png" width="566" height="514" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;我的一个同事以及其他的一些用户碰到了这个错误信息：&lt;strong&gt;&lt;em&gt;System.Data.ProviderIncompatibleException: The provider did not return a ProviderManifestToken string&lt;/em&gt;&lt;/strong&gt;。从这个错误我们并不能得到太多有用的信息，所以我们就进一步查看了Visual Studio Output Window中更详细的错误信息：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)&lt;/em&gt;&lt;/strong&gt;。熟悉SQL Server的用户肯定对这个错误信息不陌生。似乎我们的用户对相应的SQL Server数据库访问不了或权限受限？ 这怎么可能呢？之前Code First POCO class都生成得很好啊。我们此时又用SQL Server Management Studio和Visual Studio连接了相应的数据库，发现运行都很正常。太奇怪了。。。&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;span style="color: #0000ff"&gt;    public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; EFToolContext : DbContext&lt;br /&gt;    {&lt;br /&gt;        &lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; EFToolContext() : &lt;br /&gt;            base(@"&lt;span style="color: #0000ff"&gt;Data&lt;/span&gt; Source=.\;Initial &lt;span style="color: #0000ff"&gt;Catalog&lt;/span&gt;=EFTool;Integrated Security=&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;;Pooling=&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;")&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; EFToolContext()&lt;br /&gt;        { &lt;br /&gt;            &lt;span style="color: #0000ff"&gt;Database&lt;/span&gt;.SetInitializer&amp;lt;EFToolContext&amp;gt;(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DbSet&amp;lt;Child&amp;gt; Children { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DbSet&amp;lt;Parent&amp;gt; Parents { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;        protected override void OnModelCreating(DbModelBuilder modelBuilder)&lt;br /&gt;        {&lt;br /&gt;            modelBuilder.Conventions.Remove&amp;lt;IncludeMetadataConvention&amp;gt;();&lt;br /&gt;            modelBuilder.Configurations.&lt;span style="color: #0000ff"&gt;Add&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ChildMap());&lt;br /&gt;            modelBuilder.Configurations.&lt;span style="color: #0000ff"&gt;Add&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ParentMap());&lt;br /&gt;        }&lt;br /&gt;    }&lt;/div&gt;&lt;p&gt;相同的情况在我自己的机器上就能运行正常。难道是同事项目里的App.config中的connection string有问题？我们又重新检查了一下，发现connection string没有问题。另一位同事@Alan_chen此时对相应的DbContext class做了很小的修改，将connection string直接写入了class中：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;此时，EF Power Tool能运行正常。果然是哪里传递connection string出了问题。之后我发现同事的机器上并不存在.\SQLExpress实例，这个发现顿时让我茅塞顿开。难道EF Power Tool会去尝试访问.\SQLExpress吗？用SQL Server Profiler观察我机器上的.\SQLExpress实例后，发现果然如此。EF Power Tool会尝试去连接.\SQLExpress但是并不会做任何数据查询，而真正的Named Instance则无需访问，因为所有数据库端得信息已经可以从DbContext，POCO以及mapping class中得到。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;为什么要去访问.\SQLExpress实例？在我看来，这是EF Power Tool代码中的一个缺陷。为此，我也在询问有关的产品组。不过EF Power Tool也才CTP1，有些瑕疵也在所难免吧。&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://images.cnblogs.com/cnblogs_com/LingzhiSun/201106/201106131655505768.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如需转发，请注明出处，谢谢！&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/06/13/EFPowerTool_2.html"&gt;  http://www.cnblogs.com/LingzhiSun/archive/2011/06/13/EFPowerTool_2.html &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/2079879.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/06/13/EFPowerTool_2.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html</id><title type="text">Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一</title><summary type="text">Entity Framework Power Tool简介。微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-05-24T09:24:00Z</published><updated>2011-05-24T09:24:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html"/><content type="html">&lt;p&gt;好像蛮长时间没有新文章带给大家了。前几天出差再加上忙着公司里的活儿，几乎都没时间上博客园了。今天正好有些时间，为大家简单介绍EF产品组新发布的一个牛逼的小工具&amp;#8212;&amp;#8212;EF &lt;br /&gt;Power Tool（翻译的话，好像就是牛逼工具哦&lt;img alt="" src="http://www.cnblogs.com/Emoticons/qface/055242240.gif" /&gt;？） &lt;br /&gt;下次会为大家深入解析这个小工具。&amp;nbsp; 最先看到这个工具是在EF产品组最新的博客文章上，&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx"&gt;&lt;font color="#075db3"&gt;http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx&lt;/font&gt;&lt;/a&gt;。粗略读了下，感觉很酷，马上下载下来试了试，果然很酷，&lt;a href="http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/"&gt;&lt;font color="#075db3"&gt;http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/&lt;/font&gt;&lt;/a&gt;。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;大致来说，这个工具有这样几个功能：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1） 按照现有数据库结构，生成Code First POCO class、DbContext class和相应的mapping class。&lt;/p&gt;&lt;p&gt;2） 以designer模式或XML模式查看POCO class对应的Entity Data Model (edmx) 。&lt;/p&gt;&lt;p&gt;3） 查看Entity Data Model所对应的DDL。&lt;/p&gt;&lt;p&gt;4） 生成EF Generated View提高EF性能。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一起来体验下。当然请先下载安装这个小工具，安装前必须先安装&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en"&gt;&lt;strong&gt;EF4.1&lt;/strong&gt;&lt;/a&gt;。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;首先在数据库端创建两个表Parent和Child，存在一对多的关系。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/database.png" width="574" height="215" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;创建一个C#项目，并右击项目名。在弹出的菜单中选择Entity Framework &amp;#8211;&amp;gt; Reverse Engineer Code &lt;br /&gt;First。&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241657583327.png" width="548" height="561" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接着需要选择相应的数据库连接：&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241658227687.png" width="483" height="689" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接着，神奇的一幕发生了。小工具帮助我们生成了不少class：&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241700237940.png" width="345" height="519" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;相应的POCO class, DbContext class和mapping fluent API都自动生成了，真是太轻松了。这样大大方便了我们学习EF &lt;br /&gt;4.1的相关fluent API。&lt;/p&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Parent&lt;br/&gt;{&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Parent()&lt;br/&gt;{&lt;br/&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Children = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Child&amp;gt;();&lt;br/&gt;}&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ParentID { get; set; }&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Child&amp;gt; Children { get; set; }&lt;br/&gt;}  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; EFToolContext : DbContext&lt;br/&gt;{&lt;br/&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; EFToolContext()&lt;br/&gt;{&lt;br/&gt;Database.SetInitializer&amp;lt;EFToolContext&amp;gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br/&gt;}&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Child&amp;gt; Children { get; set; }&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Parent&amp;gt; Parents { get; set; }&lt;br/&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br/&gt;{&lt;br/&gt;modelBuilder.Conventions.Remove&amp;lt;IncludeMetadataConvention&amp;gt;();&lt;br/&gt;modelBuilder.Configurations.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ChildMap());&lt;br/&gt;modelBuilder.Configurations.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ParentMap());&lt;br/&gt;}&lt;br/&gt;}&lt;br /&gt;&lt;br/&gt;&lt;style type="text/css"&gt;&lt;br/&gt;.csharpcode, .csharpcode pre&lt;br/&gt;{&lt;br/&gt;font-size: small;&lt;br/&gt;color: black;&lt;br/&gt;font-family: consolas, "Courier New", courier, monospace;&lt;br/&gt;background-color: #ffffff;&lt;br/&gt;/*white-space: pre;*/&lt;br/&gt;}&lt;br/&gt;.csharpcode pre { margin: 0em; }&lt;br/&gt;.csharpcode .rem { color: #008000; }&lt;br/&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br/&gt;.csharpcode .str { color: #006080; }&lt;br/&gt;.csharpcode .op { color: #0000c0; }&lt;br/&gt;.csharpcode .preproc { color: #cc6633; }&lt;br/&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br/&gt;.csharpcode .html { color: #800000; }&lt;br/&gt;.csharpcode .attr { color: #ff0000; }&lt;br/&gt;.csharpcode .alt&lt;br/&gt;{&lt;br/&gt;background-color: #f4f4f4;&lt;br/&gt;width: 100%;&lt;br/&gt;margin: 0em;&lt;br/&gt;}&lt;br/&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br/&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ParentMap : EntityTypeConfiguration&amp;lt;Parent&amp;gt;&lt;br/&gt;{&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ParentMap()&lt;br/&gt;{&lt;br/&gt;&lt;span class="rem"&gt;// Primary Key&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.HasKey(t =&amp;gt; t.ParentID);&lt;br/&gt;&lt;span class="rem"&gt;// Properties&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Property(t =&amp;gt; t.ParentID)&lt;br/&gt;.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);&lt;br/&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Property(t =&amp;gt; t.Name)&lt;br/&gt;.IsRequired()&lt;br/&gt;.HasMaxLength(50);&lt;br/&gt;&lt;span class="rem"&gt;// Table &amp;amp; Column Mappings&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.ToTable(&lt;span class="str"&gt;"Parent"&lt;/span&gt;);&lt;br/&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Property(t =&amp;gt; t.ParentID).HasColumnName(&lt;span class="str"&gt;"ParentID"&lt;/span&gt;);&lt;br/&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Property(t =&amp;gt; t.Name).HasColumnName(&lt;span class="str"&gt;"Name"&lt;/span&gt;);&lt;br/&gt;}&lt;br/&gt;}&lt;br /&gt;&lt;br/&gt;&lt;p&gt;拥有了这些class之后，我们还可以通过小工具来查看相应的Entity Data Model以及对应的DDL。更牛的是，小工具还可以为我们生产EF &lt;br /&gt;Generated View的代码，以提高我们使用EF和Code First时的性能。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241706022180.png" width="516" height="469" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;值得一提的是，这里的Entity Data Model，Entity Data Model XML和Entity Data Model &lt;br /&gt;DDL都是只读的，它们被生成在C:\Users\[username]\AppData\Local\Temp\文件夹下。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在选择Optimize Entity Data Model之后，小工具会为你的项目增加一个.View.cs文件，期中就包括了Generated &lt;br /&gt;Views的代码。有关Generated View的更详细信息，请参见：&lt;a title="http://msdn.microsoft.com/en-us/library/bb896240.aspx" href="http://msdn.microsoft.com/en-us/library/bb896240.aspx"&gt;&lt;font color="#075db3"&gt;http://msdn.microsoft.com/en-us/library/bb896240.aspx&lt;/font&gt;&lt;/a&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/lingzhisun/201105/201105241711306812.png" width="408" height="598" /&gt;。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;是不是觉得这个工具很酷呢？赶紧下载吧！ &lt;a href="http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/"&gt;&lt;font color="#075db3"&gt;http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;PS1: 顺便为大家奉上新鲜出炉的&lt;strong&gt;&lt;a href="http://1codechs.codeplex.com/"&gt;微软一站式示例代码库&lt;/a&gt;&lt;/strong&gt;中文宣传视频，绝对给力，我翻译的字幕哟&lt;img alt="" src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" /&gt;：&lt;/p&gt;&lt;embed src="http://player.youku.com/player.php/sid/XMjcwNTQ2OTIw/v.swf" quality="high" width="480" height="400" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;     &lt;p&gt;&amp;nbsp;&lt;/p&gt;     &lt;p&gt;&lt;br /&gt;     &lt;/p&gt;     &lt;p&gt;PS2: 为大家带来另一个超级酷的小工具：MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img alt="" src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" /&gt;）&lt;/p&gt;     &lt;div&gt;     &lt;div&gt;     &lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" /&gt;&lt;/a&gt;&lt;br /&gt;     &lt;/p&gt;     &lt;/div&gt;     &lt;/div&gt;     &lt;p&gt;也欢迎到MSDN中文论坛&lt;a style="font-weight: bold;" href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads"&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！ &lt;/p&gt;     &lt;p&gt;&amp;nbsp;&lt;/p&gt;     &lt;p&gt;如需转发请注明原文出处，谢谢： &lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html&lt;/a&gt;     &lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/2055761.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html</id><title type="text">Entity Framework 小技巧五 —— 如何得到EF查询生成的SQL？</title><summary type="text">Entity Framework 实用小技巧一则 —— 如何得到EF查询生成的SQL？微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-05-05T01:07:00Z</published><updated>2011-05-05T01:07:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html"/><content type="html">&lt;p&gt;最近挺忙的，只能为大家带来一些使用EF的小技巧。有关EF4.1的使用与探索将在之后一段时间为大家奉上。今天为大家带来如何得到EF查询所生成的SQL。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在EF 4和EF 3.5 SP1中，我们可以使用&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx"&gt;&lt;strong&gt;ToTraceString()&lt;/strong&gt;&lt;/a&gt;方法得到EF查询所生成的SQL。&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TestDBEntities())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;from&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Parents&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Lingzhi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;p;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ObjectQuery&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Parent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;parents&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ObjectQuery&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Parent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(parents&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sql&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;parents.ToTraceString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里所生成的SQL为：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;ParentID&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;ParentID&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Parent&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 14px; "&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; "&gt;&lt;span style="color: #0000FF;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;N&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;'&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Lingzhi&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;'&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在EF 4.1中，我们可以直接调用DbQuery&amp;lt;&amp;gt;的&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg696144(v=VS.103).aspx"&gt;ToString()&lt;/a&gt;&lt;/strong&gt;方法得到所生成的SQL。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;people&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;from&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.PersonID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;p;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sql&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;people.ToString();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;所生成的SQL是：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;PersonID&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;PersonID&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;People&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;[&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;PersonID&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;大家应该已经猜到，这里的ToString()方法其实也就是调用了ObjectQuery&amp;lt;&amp;gt;的ToTraceString()方法。DbQuery&amp;lt;&amp;gt;.ToString() ==&amp;gt; System.Data.Entity.Internal.Linq.InternalQuery&amp;lt;&amp;gt;.ToString()方法，此方法在.NET Reflector得到的实现是这样的：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ToString()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._objectQuery.ToTraceString();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以上讨论的方法都只能得到普通Select查询所生成的SQL，像其他Loading啊，更新啊，删除啊，添加等所生成的SQL并不能得到。EF并不像LINQ to SQL有&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.log.aspx"&gt;DataContext.Log&lt;/a&gt;可以得到所有被执行的SQL命令。要实现这样的功能，需要自己拓展一下EF的data provider，比如这个例子：&lt;a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32"&gt;http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32&lt;/a&gt;。（可能的话，以后会为大家详细介绍下这个很酷的provider）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;当然我们也可以使用Visual Studio 2010 Ultimate所带的&lt;a href="http://msdn.microsoft.com/en-us/library/dd264915.aspx"&gt;IntelliTrace&lt;/a&gt;功能或者&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms181091.aspx"&gt;SQL Server Profiler&lt;/a&gt;来得到EF所生成的SQL。 不过这两种方法只针对SQL Server和对应的T-SQL。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;PS1：这里为大家带来一个好消息：&lt;strong&gt;&lt;a href="http://1code.codeplex.com/"&gt;微软一站式实例代码库(Microsoft All-In-One Code Framework)&lt;/a&gt;&lt;/strong&gt;即日起正式迁移至&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;strong&gt;MSDN代码库&lt;/strong&gt;&lt;/a&gt;了，新的平台会帮您更轻松地解决开发难题、节省更多时间、获得更友好的用户体验。本人作为这个项目的元老，见到我们已拥有600多个经典的代码实例，甚感欣慰啊！&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;&amp;nbsp;&amp;nbsp;更详细信息，请看&lt;a href="http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN"&gt;http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最新的&lt;strong&gt;代码浏览器&lt;/strong&gt;也发布啦！为大家带来了更多很cool的功能，比如&lt;strong&gt;1）代码按需下载 2）实例集中化管理 &amp;nbsp;3）自动更新&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.csdn.net/MSCodeSample/archive/2011/04/18/6331382.aspx"&gt;http://blog.csdn.net/MSCodeSample/archive/2011/04/18/6331382.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;之后我将尽力为大家带来更多有关EF的代码实例以及相关的介绍！&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/All-In-OneCodesmallbanner220x220.jpg" width="220" height="220" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PS2：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;如需转发请注明原文出处，谢谢：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/2037139.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html</id><title type="text">Entity Framework 小技巧四 —— 如何使用NoTracking查询得到Detached状态的实体？</title><summary type="text">Entity Framework 实用小技巧一则 —— 如何使用NoTracking查询得到Detached状态的实体？微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-04-27T01:16:00Z</published><updated>2011-04-27T01:16:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html"/><content type="html">&lt;p&gt;有时我们的实体只需要显示，无需更新，所以为了提高性能，我们不需要实体被EF context追踪。此时可以使用NoTracking的查询来得到实体，这样实体的状态会是Detached状态。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在EF3.5 SP1和EF 4中，我们可以这样来进行NoTracking查询：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;context.People.MergeOption&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;=&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&amp;nbsp;System.Data.Objects.MergeOption.NoTracking;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;list&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Where(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;PersonID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;).ToList();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;或使用ExecuteStoreQuery API来直接调用SQL命令来得到实体：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.ExecuteStoreQuery&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Parent&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;Parent&amp;nbsp;WHERE&amp;nbsp;Parent.ParentID&amp;nbsp;&amp;gt;&amp;nbsp;@ID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestDBEntities.Parents&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;strong&gt;System.Data.Objects.MergeOption.NoTracking&lt;/strong&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;SqlParameter(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@ID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;或使用Load方法得到相关实体：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.ContextOptions.LazyLoadingEnabled&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;person&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.First();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;strong&gt;person.Courses.Load(System.Data.Objects.MergeOption.NoTracking);&lt;/strong&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;在EF 4.1中，我们可以使用新增的AsNoTracking方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;people&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Where(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.PersonID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;).&lt;strong&gt;AsNoTracking&lt;/strong&gt;().ToList();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里的AsNoTracking方法内部调用了过去的ObjectQuery.MergeOption来实现NoTracking查询。此方法（DbHelpers.CreateNoTrackingQuery）是AsNoTracking方法的核心：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IQueryable&amp;nbsp;CreateNoTrackingQuery(ObjectQuery&amp;nbsp;query)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IQueryable&amp;nbsp;queryable&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;query;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ObjectQuery&amp;nbsp;query2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(ObjectQuery)&amp;nbsp;queryable.Provider.CreateQuery(queryable.Expression);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;query2.MergeOption&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;=&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&amp;nbsp;MergeOption.NoTracking;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;query2;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再为大家介绍NoTracking得到的Detached实体的一个小问题。由NoTracking查询得到的实体和我们直接调用&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.detach.aspx"&gt;Detach&lt;/a&gt;方法得到的实体不同。前者内部会仍然保留一个对当前context的引用，以便在调用Load方法可以explicitly load相关的实体。而后者则完全脱离了相应的context，所以属于真正的Detached状态。细心的读者可能会觉得NoTracking得到的Detached实体会导致context一直被引用，从而不能及时被垃圾处理（GC）。确实，这个被产品组证实是by design的，如果context不被引用，则explicit load则无法被支持。有关这个问题的更详细信息，请参看：&lt;/p&gt;&lt;p&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/507482/entity-framework-query-with-mergeoption-notracking-result-memory-leak"&gt;http://connect.microsoft.com/VisualStudio/feedback/details/507482/entity-framework-query-with-mergeoption-notracking-result-memory-leak&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/906c0cad-840b-4eb8-ba11-5348d407df73"&gt;http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/906c0cad-840b-4eb8-ba11-5348d407df73&lt;/a&gt;&amp;nbsp;(我前年处理的一个MSDN帖子)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;PS1：这里为大家带来一个好消息：&lt;strong&gt;&lt;a href="http://1code.codeplex.com/"&gt;微软一站式实例代码库(Microsoft All-In-One Code Framework)&lt;/a&gt;&lt;/strong&gt;即日起正式迁移至&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;strong&gt;MSDN代码库&lt;/strong&gt;&lt;/a&gt;了，新的平台会帮您更轻松地解决开发难题、节省更多时间、获得更友好的用户体验。本人作为这个项目的元老，见到我们已拥有600多个经典的代码实例，甚感欣慰啊！&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;&amp;nbsp;&amp;nbsp;更详细信息，请看&lt;a href="http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN"&gt;http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最新的&lt;strong&gt;代码浏览器&lt;/strong&gt;也发布啦！为大家带来了更多很cool的功能，比如&lt;strong&gt;1）代码按需下载 2）实例集中化管理 &amp;nbsp;3）自动更新&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.csdn.net/MSCodeSample/archive/2011/04/18/6331382.aspx"&gt;http://blog.csdn.net/MSCodeSample/archive/2011/04/18/6331382.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;之后我将尽力为大家带来更多有关EF的代码实例以及相关的介绍！&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/All-In-OneCodesmallbanner220x220.jpg" width="220" height="220" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PS2：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;div&gt;如需转发请注明原文出处，谢谢：&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/2029843.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/04/19/EF_Trick3.html</id><title type="text">Entity Framework 小技巧三 —— 如何在导入集合类型的Navigation Property时增加过滤条件？</title><summary type="text">Entity Framework 实用小技巧一则 —— 如何在导入集合类型的Navigation Property时增加过滤条件？微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-04-19T01:11:00Z</published><updated>2011-04-19T01:11:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/19/EF_Trick3.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/19/EF_Trick3.html"/><content type="html">&lt;p&gt;在使用EF的集合类型的Navigation Property时，我时常需要只导入符合特定条件的实体对象，例如：Blog类和Post类存在一对多关系，即一个博客可以拥有多篇博文。现在我们想获得博客以及其相关博文中在今年1月1日之后发表的所有博文，可是之前EF版本所提供的&lt;strong&gt;Lazy Loading&lt;/strong&gt;、&lt;strong&gt;Explicitly Loading&lt;/strong&gt;和&lt;strong&gt;Eagerly Loading&lt;/strong&gt;都不支持在Navigation Property上增加一个过滤条件。有关三种Loading的详细信息，不在本文过多介绍，请见MSDN文档：&lt;a href="http://msdn.microsoft.com/en-us/library/bb896272.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb896272.aspx&lt;/a&gt;，或者参看我以前写过的一篇英文MSDN博客：&lt;a href="http://blogs.msdn.com/b/msdnforum/archive/2010/07/12/community-goodies-lazy-loading-in-entity-framework-4.aspx"&gt;http://blogs.msdn.com/b/msdnforum/archive/2010/07/12/community-goodies-lazy-loading-in-entity-framework-4.aspx&lt;/a&gt;。之后也会为大家带来有关Loading的文章。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;过去我们可以用以下两种方法来实现这一目的：&lt;/p&gt;&lt;p&gt;1) &amp;nbsp;利用匿名类，并且将过滤条件嵌入到返回的匿名类中：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectContext))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(from&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Blogs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b.Tags.Contains(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EF&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Blog&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Posts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b.Posts.Where(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.CreationTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DateTime(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2011&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}).ToList();&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 14px; "&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; "&gt;}&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;不过，此方法的缺点显而易见， 我们必须使用匿名类来包装实体对象，在数据绑定时会有挺多问题。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2) &amp;nbsp; 使用多个query，让EF的跟踪机制帮助我们建立对象之间的联系。（EF4和EF4.1中，我们需要关闭Lazy Loading）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectContext))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;For&amp;nbsp;EF4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;font class="Apple-style-span" color="#008000"&gt;&amp;nbsp;context.ContextOptions.LazyLoadingEnabled&amp;nbsp;=&amp;nbsp;false;&lt;/font&gt;&lt;br /&gt;&lt;font class="Apple-style-span" color="#008000"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #000000; "&gt;&lt;span style="font-family: 'Courier New'; color: #008000; "&gt;//&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #008000; "&gt;&amp;nbsp;For&amp;nbsp;EF4.1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;font class="Apple-style-span" color="#008000"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #000000; "&gt;&lt;span style="font-family: 'Courier New'; color: #008000; "&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #000000; "&gt;&lt;span style="font-family: 'Courier New'; color: #008000; "&gt;&amp;nbsp;context.Configuration.LazyLoadingEnabled&amp;nbsp;=&amp;nbsp;false;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;blogs&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(from&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Blogs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b.Tags.Contains(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EF&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;b).ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;posts&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(from&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Posts&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.Blog.Tags.Contains(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EF&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.CreationTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DateTime(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2011&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;p).ToList();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在两个query执行之后，EF的ObjectStateManager会自动建立Blog和Post之间的关系，如果我们访问blogs.First().Posts属性，将得到的都是今年1月1日之后创建的博文。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;当然我想这两个方法在EF4.1中同样能成功。幸运的是，EF4.1提供了新的功能使我们可以在使用Explicitly Loading时添加过滤条件。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;blog&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Blogs.Where(b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b.Tags.Contains(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EF&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)).First();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Entry(blog).&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;Collection(b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;nbsp;b.Posts)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Query()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Where(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.CreationTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DateTime(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2011&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Load();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;或者使用String类型来标记Blog与Post的关系&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Entry(blog).&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;Collection(&lt;/span&gt;&lt;span style="color: #800000; background-color: yellow; "&gt;"&lt;/span&gt;&lt;span style="color: #800000; background-color: yellow; "&gt;Posts&lt;/span&gt;&lt;span style="color: #800000; background-color: yellow; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Query().Cast&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Post&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Where(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.CreationTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DateTime(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2011&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Load();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Collection()方法在这里返回DbCollectionEntry，Query()方法返回对应的IQueryable&amp;lt;T&amp;gt;对象。熟悉LINQ的同志们一定知道，得到IQueryable&amp;lt;T&amp;gt;了的话，一切好说，哈哈。EF4.1中，System.Data.Entity命名空间下的DbExtensions类中定义了不少LINQ的扩展方法，其中一个就是Load方法。用Reflector看了下Load方法的实现，其实就是调用IEnumerator.MoveNext遍历一遍集合：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(IEnumerator&amp;nbsp;enumerator&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;source.GetEnumerator())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(enumerator.MoveNext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;值得注意的是：在EF4.1中使用这一功能最好也关闭Lazy Loading，否则一旦对应的集合类型的Navigation Property被访问的话，所有对应的实体都将被导入。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;当然这里如果我们不想导入这些相关的实体对象，也可以使用Count()方法得到符合条件对象的数量。这样我们得到的是实体的数量，而没有一个对应实体会被导入。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;blog&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Blogs.Where(b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b.Tags.Contains(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EF&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)).First();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Entry(blog).Collection(b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;b.Posts)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Query()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Count();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;一口气搞定这篇，希望对大家学习EF有所帮助吧！&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;PS1：这里为大家带来一个好消息：&lt;strong&gt;&lt;a href="http://1code.codeplex.com/"&gt;微软一站式实例代码库(Microsoft All-In-One Code Framework)&lt;/a&gt;&lt;/strong&gt;即日起正式迁移至&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;strong&gt;MSDN代码库&lt;/strong&gt;&lt;/a&gt;了，新的平台会帮您更轻松地解决开发难题、节省更多时间、获得更友好的用户体验。本人作为这个项目的元老，见到我们已拥有600多个经典的代码实例，甚感欣慰啊！&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;&amp;nbsp;&amp;nbsp;更详细信息，请看&lt;a href="http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN"&gt;http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最新的&lt;strong&gt;代码浏览器&lt;/strong&gt;也发布啦！为大家带来了更多很cool的功能，比如&lt;strong&gt;1）代码按需下载 2）实例集中化管理 &amp;nbsp;3）自动更新&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.csdn.net/MSCodeSample/archive/2011/04/18/6331382.aspx"&gt;http://blog.csdn.net/MSCodeSample/archive/2011/04/18/6331382.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;之后我将尽力为大家带来更多有关EF的代码实例以及相关的介绍！&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/All-In-OneCodesmallbanner220x220.jpg" width="220" height="220" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PS2：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如需转发请注明原文出处，谢谢：&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/19/EF_Trick3.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/04/19/EF_Trick3.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/2020075.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/19/EF_Trick3.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html</id><title type="text">Entity Framework 小技巧二 —— 如何在EF中直接运行SQL命令</title><summary type="text">Entity Framework 实用小技巧一则 —— 如何在EF中直接运行SQL命令。微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-04-15T03:09:00Z</published><updated>2011-04-15T03:09:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html"/><content type="html">&lt;p&gt;相信不少使用EF的同志们已经知道如何在EF中运行SQL命令了。我在这里简单总结下，希望对大家学习EF有所帮助！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在EF第一个版本（.NET 3.5 SP1）中，我们只能通过将ObjectContext.Connection转换为EntityConnection，再把EntityConnection.StoreConnection转换为SqlConnection。有了这个SqlConnection，我们再创建SqlCommand便能顺利运行SQL命令了。（个人觉得其实很烦，呵呵）&lt;/p&gt;&lt;p&gt;在EF4（.NET 4）中，我们有了全新的API：ObjectContext.ExecuteStoreCommand(...)和ObjectContext.ExecuteStoreQuery&amp;lt;T&amp;gt;(...)。从函数名不难知道前者是为了执行某一并无返回集的SQL命令，例如UPDATE，DELETE操作；后者是执行某一个查询，并可以将返回集转换为某一对象。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;ctx&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.ExecuteStoreCommand(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UPDATE&amp;nbsp;Person&amp;nbsp;SET&amp;nbsp;Name&amp;nbsp;=&amp;nbsp;'Michael'&amp;nbsp;WHERE&amp;nbsp;PersonID&amp;nbsp;=&amp;nbsp;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;ctx&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;peopleViews&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ctx.ExecuteStoreQuery&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;PersonView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT&amp;nbsp;PersonID,&amp;nbsp;Name&amp;nbsp;FROM&amp;nbsp;Person&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;PersonView&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;PersonID&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Name&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;现在有了EF4.1，API的名字又有了些许改变。如果说DbContext将ObjectContext做了包装，那么DbContext.Database就是对应于数据库端信息的封装。执行SQL命令也自然从&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.database(v=VS.103).aspx"&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/a&gt;类型开始。对应于ExecuteStoreCommand和ExecuteStoreQuery&amp;lt;T&amp;gt;的是&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.database.executesqlcommand(v=VS.103).aspx"&gt;Database.ExecuteSqlCommand&lt;/a&gt;和&lt;a href="http://msdn.microsoft.com/en-us/library/gg679117(v=VS.103).aspx"&gt;Database.SqlQuery&amp;lt;T&amp;gt;&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;ctx&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.Database.ExecuteSqlCommand(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UPDATE&amp;nbsp;Person&amp;nbsp;SET&amp;nbsp;Name&amp;nbsp;=&amp;nbsp;'Michael'&amp;nbsp;WHERE&amp;nbsp;PersonID&amp;nbsp;=&amp;nbsp;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;ctx&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;peopleViews&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ctx.SqlQuery&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;PersonView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT&amp;nbsp;PersonID,&amp;nbsp;Name&amp;nbsp;FROM&amp;nbsp;Person&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).ToList();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;PersonView&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;PersonID&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Name&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;有关DbContext.Database属性的使用与分析，将在近期为大家奉上！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;PS1：这里为大家带来一个好消息：&lt;strong&gt;&lt;a href="http://1code.codeplex.com/"&gt;微软一站式实例代码库(Microsoft All-In-One Code Framework)&lt;/a&gt;&lt;/strong&gt;即日起正式迁移至&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;strong&gt;MSDN代码库&lt;/strong&gt;&lt;/a&gt;了，新的平台会帮您更轻松地解决开发难题、节省更多时间、获得更友好的用户体验。本人作为这个项目的元老，见到我们已拥有600多个经典的代码实例，甚感欣慰啊！&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;&amp;nbsp;&amp;nbsp;更详细信息，请看&lt;a href="http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN"&gt;http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN&lt;/a&gt;&lt;/p&gt;&lt;p&gt;之后我将尽力为大家带来更多有关EF的代码实例以及相关的介绍！&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/All-In-OneCodesmallbanner220x220.jpg" width="220" height="220" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PS2：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;如需转发请注明原文出处，谢谢：&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html&lt;/a&gt;。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/2007337.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html</id><title type="text">Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值？</title><summary type="text">Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值？ EF4.1系列博文第三篇！微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-04-13T01:32:00Z</published><updated>2011-04-13T01:32:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-family:宋体;"&gt;之前的两篇有关&lt;/span&gt;EF4.1&lt;span style="font-family:宋体;"&gt;的文章反响不错，感谢大家的支持！想体验&lt;/span&gt;EF4.1&lt;span style="font-family:宋体;"&gt;的新功能？RTW版本已经发布啦&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;，&lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;Times New Roman&amp;quot;;Times New Roman&amp;quot;;color:#223355"&gt;Entity Framework 4.1 DbContext&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt; font-family:宋体;color:#223355"&gt;使用记之一&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;Times New Roman&amp;quot;;color:#223355"&gt;&amp;#8212;&amp;#8212;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;font-family:宋体; color:#223355"&gt;如何查找实体？&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;Times New Roman&amp;quot;;Times New Roman&amp;quot;;color:#223355"&gt; DbSet.Find&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:#223355"&gt;函数的使用与实现&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html"&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;line-height: 115%;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;color:#223355"&gt;Entity Framework 4.1 DbContext&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;line-height:115%;font-family:宋体;color:#223355"&gt;使用记之二&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;line-height:115%;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;color:#223355"&gt;&amp;#8212;&amp;#8212;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;line-height:115%;font-family: 宋体;color:#223355"&gt;如何玩转本地实体？&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt;line-height: 115%;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;color:#223355"&gt; DbSet.Local&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size:9.0pt; line-height:115%;font-family:宋体;color:#223355"&gt;属性的使用与实现&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;今天的主题是如何玩转&lt;/span&gt;EF4.1&lt;span style="font-family: 宋体; "&gt;中实体的属性。实体的属性其实是我们使用EF来访问和修改实体的关键。在EF以前版本中，如果我们一般会直接访问对象的属性，比如得到PersonID大于100的所有Person实体的ID和Name：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;people&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Where(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.PersonID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;people)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ID:&amp;nbsp;{0},&amp;nbsp;Name:{1}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;p.PersonID,&amp;nbsp;p.Name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;但是如果要得到ObjectContext所track的实体属性的OriginalValues（原始值）和CurrentValues（当前值），则不是很方便。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;而在EF4.1中，由于我们可以使用&lt;a href="http://msdn.microsoft.com/en-us/library/gg696238(v=VS.103).aspx"&gt;DbContext.Entry()&lt;/a&gt;或&lt;a href="http://msdn.microsoft.com/en-us/library/gg696578(v=VS.103).aspx"&gt;DbContext.Entry&amp;lt;T&amp;gt;()&lt;/a&gt;来得到&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry(v=VS.103).aspx"&gt;DbEntityEntry&lt;/a&gt;或&lt;a href="http://msdn.microsoft.com/en-us/library/gg696410(v=VS.103).aspx"&gt;DbEntityEntry&amp;lt;T&amp;gt;&lt;/a&gt;对象。通过DbEntityEntry （DbEntityEntry&amp;lt;T&amp;gt;）的OriginalValues和CurrentValues属性，我们可以方便地得到相应的属性集合（&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbpropertyvalues(v=VS.103).aspx"&gt;DbPropertyValues&lt;/a&gt;）。通过DbEntityEntry （DbEntityEntry&amp;lt;T&amp;gt;）的&lt;a href="http://msdn.microsoft.com/en-us/library/gg696133(v=VS.103).aspx"&gt;Property（Property&amp;lt;T&amp;gt;）&lt;/a&gt;方法得到&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbpropertyentry(v=VS.103).aspx"&gt;DbPropertyEntry&lt;/a&gt;（&lt;a href="http://msdn.microsoft.com/en-us/library/gg679512(v=VS.103).aspx"&gt;DbPropertyEntry&amp;lt;T&amp;gt;&lt;/a&gt;）之后，我们也能通过相应的OriginalValue和CurrentValue属性得到单个属性的原始值和当前值。感觉有点绕？看看下面的这些例子应该就简单明了多了！&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;有关Find方法，请看&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"&gt;EF4.1系列博文一&lt;/a&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;person&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Find(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;得到Person.Name属性的当前值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;currentName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Entry(person).Property(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.Name).CurrentValue;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;设置Person.Name属性的当前值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Entry(person).Property(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.Name).CurrentValue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Michael&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;通过string值"Name"来获得DbPropertyEntry，而非通过Lambda&amp;nbsp;Expression&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;currentName2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Entry(person).Property(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).CurrentValue;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再来看看如何得到实体的所有属性的OriginalValue（原始值），CurrentValue（当前值）和DatabaseValue（数据库值）吧：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;person&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Find(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;改变对应的实体的Name属性&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;person.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Michael&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;改变对应属性的数据库值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Database.ExecuteSqlCommand(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;update&amp;nbsp;Person set&amp;nbsp;Name&amp;nbsp;=&amp;nbsp;'Lingzhi'&amp;nbsp;where PersonID =&amp;nbsp;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;输出对应实体所有属性的当前值，原始值和数据库值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Current&amp;nbsp;values:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintValues(context.Entry(person).CurrentValues);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\nOriginal&amp;nbsp;values:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintValues(context.Entry(person).OriginalValues);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\nDatabase&amp;nbsp;values:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintValues(context.Entry(person).GetDatabaseValues());&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里用到的PrintValues函数实现如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;PrintValues(DbPropertyValues&amp;nbsp;values)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;propertyName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;values.PropertyNames)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Property&amp;nbsp;{0}&amp;nbsp;has&amp;nbsp;value&amp;nbsp;{1}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;propertyName,&amp;nbsp;values[propertyName]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里具体的输出大家就当小练习吧，呵呵。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面再为大家介绍两个我个人认为比较cool的小功能：&lt;/p&gt;&lt;p&gt;1) 设置多层的复杂类型的属性。&lt;/p&gt;&lt;p&gt;例如，Person实体含有Address复杂类型属性（Complex - type），Address又含有City这一string类型属性，那么我们可以这样来获得City这一属性的当前值:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;使用Lambda&amp;nbsp;Expression&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;city&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Entry(person).Property(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.Address.City).CurrentValue;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;使用string类型的属性表达&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;city&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Entry(person).Property(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Address.City&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).CurrentValue;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里层次的次数其实没有限制，可以一直点下去的。:) &amp;nbsp; EF的内部实现也是使用递归调用的方式，之后会有详细的介绍。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2) 克隆含有实体属性当期值，原始值或数据库值的对象。&lt;/p&gt;&lt;p&gt;我们可以使用&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbpropertyvalues.toobject(v=VS.103).aspx"&gt;DbPropertyValues.ToObject()&lt;/a&gt;方法来克隆将DbPropertyValues中相应的属性和值变成对象。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;person&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Find(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;clonedPerson&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Entry(person).GetDatabaseValues().ToObject();&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;这里克隆到的对象不是实体类，也不被DbContext所跟踪。但这样的对象在处理数据库并发等问题时会很有用。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;又到了探寻以上介绍的功能的内部实现的时候啦！我们还是照例使用&lt;a href="http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1"&gt;.NET Reflector&lt;/a&gt;来查看EntityFramework.dll。 大家可以打开Reflector和我一起来做个简单的分析。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;首先是从DbContext.Entry方法得到DbEntityEntry。Entry方法通过调用DbEntityEntry internal的构造函数DbEntityEntry(InternalEntityEntry internalEntityEntry)来创建一个DbEntityEntry对象。这里的InternalEntityEntry又是通过DbContext.InternalContext和先前传入Entry函数的实体对象来生成的。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;InternalEntityEntry(InternalContext&amp;nbsp;internalContext,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;entity)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._internalContext&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;internalContext;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._entity&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;entity;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;ObjectContextTypeCache应该是EF内部保存的静态的类型缓存，用于查找实体类型&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._entityType&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ObjectContextTypeCache.GetObjectType(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._entity.GetType());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;InternalContext.GetStateEntry内部则调用了ObjectStateManager.TryGetObjectStateEntry方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._stateEntry&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._internalContext.GetStateEntry(entity);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._stateEntry&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._internalContext.Set(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._entityType).InternalSet.Initialize();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面来看看DbEntityEntry.CurrentValues/OriginalValues。CurrentValues和OriginalValues属性都是DbPropertyValues类型的。DbPropertyValues可以被理解为对于一个实体或复杂类型所有属性信息的集合。我们通过PropertyNames属性拿到其所有属性的名字，通过GetValue或SetValues方法得到或设置属性值。还能通过我们之前讨论的ToObject方法来克隆一个有用与对应实体或复杂类型对象一样属性值的对象。演示一下如何使用DbPropertyValues.SetValuesF方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;person&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Find(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;person1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Person&amp;nbsp;{&amp;nbsp;PersonID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Michael&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;person2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Person&amp;nbsp;{&amp;nbsp;PersonID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Lingzhi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;};&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;entry&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.Entry(person);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;这里直接将拥有相应属性值的实体对象直接赋给SetValues方法，直接对person实体的CurrentValues和OriginalValues进行赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry.CurrentValues.SetValues(person1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry.OriginalValues.SetValues(person2);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里SetValues内部首先调用了DbHelpers.GetPropertyGetters方法。DbHelpers是System.Data.Entity.Internal命名空间下Internal的类，包含了许多静态的辅助方法。这里的GetPropertyGetters顾名思义就是得到属性Getter方法delegate的集合，内部当然是通过PropertyInfo以及.NET Reflection来完成。有了这个Getter方法delegate的集合，我们就能方便地拿到传入SetValues方法的对象的所有属性值了，最后则按照所得到的属性值来进行赋值。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接着我们再来看看如何从DbEntityEntry.Property得到DbPropertyEntry。我们可以传递两种property的表达方式给DbEntityEntry.Property方法：1) Lambda Expression &amp;nbsp; 2) string类型的property表示。先来说说1)，在将Lambda Expression解析为对应property时，EF使用了辅助静态方法DbHelpers.ParsePropertySelector，ParsePropertySelector又调用了另一静态辅助方法DbHelpers.TryParsePath。具体算法在这里就不做深入解析，简单说这个TryParsePath方法就是递归地将Lambda Expression所表示的property层层深入地获取到，例如像这样的Lambda Expression：person =&amp;gt; person.Address.City最后就变为"Address.City"。在解析完毕之后，ParsePropertySelector其实也是将Lambda Expression变成了string类型的property表示。自然，EF此时就调用了第二个接受string类型的property表示的DbEntityEntry.Property重载。DbEntityEntry.Property(string)在经过了一系列其他的内部调用之后，到了System.Data.Entity.Internal.InternalEntityEntry.Property(...):&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;InternalPropertyEntry&amp;nbsp;Property(InternalPropertyEntry&amp;nbsp;parentProperty,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;propertyName,&amp;nbsp;IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;properties,&amp;nbsp;Type&amp;nbsp;requestedType,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;requireComplex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;flag&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;properties.Count&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;type&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;flag&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;:&amp;nbsp;requestedType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;declaringType&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(parentProperty&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;parentProperty.EntryMetadata.ElementType&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.EntityType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PropertyEntryMetadata&amp;nbsp;metadata&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.ValidateAndGetPropertyMetadata(properties[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&amp;nbsp;declaringType,&amp;nbsp;type);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;((metadata&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;((flag&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;requireComplex)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;metadata.IsComplex))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(flag)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Error.DbEntityEntry_DottedPartNotComplex(properties[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&amp;nbsp;propertyName,&amp;nbsp;declaringType.Name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(requireComplex&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Error.DbEntityEntry_NotAComplexProperty(properties[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&amp;nbsp;declaringType.Name)&amp;nbsp;:&amp;nbsp;Error.DbEntityEntry_NotAScalarProperty(properties[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&amp;nbsp;declaringType.Name));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternalPropertyEntry&amp;nbsp;entry&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(InternalPropertyEntry)&amp;nbsp;metadata.CreateMemberEntry(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;parentProperty);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;flag)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;entry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Property(entry,&amp;nbsp;propertyName,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;properties.Skip&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;(&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;).ToList&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;()&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;requestedType,&amp;nbsp;requireComplex);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;从标黄的语句中不难发现，这个函数也是递归调用，并且将多层的property一一解析。&amp;nbsp;System.Data.Entity.Internal.InternalEntityEntry.Property函数返回InternalPropertyEntry类型的对象。这个对象又被返回给DbPropertyEntry.Create方法，Create方法又调用了InternalPropertyEntry.CreateDbMemberEntry:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DbMemberEntry&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity,&amp;nbsp;TProperty&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CreateDbMemberEntry&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity,&amp;nbsp;TProperty&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TEntity:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.EntryMetadata.IsComplex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;nbsp;DbPropertyEntry&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;TEntity,&amp;nbsp;TProperty&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;(&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;);&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;nbsp;DbComplexPropertyEntry&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;TEntity,&amp;nbsp;TProperty&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;(&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;);&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里的逻辑很简单，将property分成一般的属性或复杂类型的属性，分别处理之。分析到这里，大家应该也发现了DbPropertyEntry中大部分信息都保存在其内部的InternalPropertyEntry对象里。这样的设计在解析EntityFramework.dll时，我们会经常看到。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;呼！这篇文章不是一口气写完的了，这几天挺忙的，不过每天添几笔，可能思路有些混乱，大家见谅，哈哈！还是那句话，希望对您学习EF有点帮助吧！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;PS1：这里为大家带来一个好消息：&lt;strong&gt;&lt;a href="http://1code.codeplex.com/"&gt;微软一站式实例代码库(Microsoft All-In-One Code Framework)&lt;/a&gt;&lt;/strong&gt;即日起正式迁移至&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;strong&gt;MSDN代码库&lt;/strong&gt;&lt;/a&gt;了，新的平台会帮您更轻松地解决开发难题、节省更多时间、获得更友好的用户体验。本人作为这个项目的元老，见到我们已拥有600多个经典的代码实例，甚感欣慰啊！&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;&amp;nbsp;&amp;nbsp;更详细信息，请看&lt;a href="http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN"&gt;http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN&lt;/a&gt;&lt;/p&gt;&lt;p&gt;之后我将尽力为大家带来更多有关EF的代码实例以及相关的介绍！&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=User&amp;amp;f%5B0%5D.Value=All-In-One%20Code%20Framework&amp;amp;f%5B0%5D.Text=All-In-One%20Code%20Framework"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/All-In-OneCodesmallbanner220x220.jpg" width="220" height="220" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PS2：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如需转发请注明原文出处，谢谢：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/1999353.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/03/30/EF_Trick1.html</id><title type="text">Entity Framework 小技巧一 —— 如何从DbContext得到其内部封装的ObjectContext</title><summary type="text">Entity Framework 实用小技巧一则 —— 如何从DbContext得到其内部封装的ObjectContext。微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-03-30T01:10:00Z</published><updated>2011-03-30T01:10:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/30/EF_Trick1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/30/EF_Trick1.html"/><content type="html">&lt;p&gt;DbContext及其相关的API是&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en"&gt;EF4.1&lt;/a&gt;中一大新特性。简单说，DbContext就是之前EF的核心类ObjectContext的抽象封装。如果用.NET Reflector看一下DbContext的内部实现，不难发现其内部有一私有成员_internalContext，它属于InternalContext这一Internal的类。DbContext内部的许多函数就是通过InternalContext.ObjectContext属性来得到其内部封装的ObjectContext类并调用其方法的。由于_internalContext是私有成员，要得到它的值需动用反射，好像太劳师动众了。今天为大家介绍十分方便的一个小技巧来得到DbContext内部封装的ObjectContext。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;DbContext实现两个接口：&lt;strong&gt;IDisposable&lt;/strong&gt;和&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.iobjectcontextadapter(v=VS.103).aspx"&gt;IObjectContextAdapter&lt;/a&gt;&lt;/strong&gt;。前者的博大精深在本文就不提及了。IObjectContextAdapter按照&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.iobjectcontextadapter(v=VS.103).aspx"&gt;MSDN文档&lt;/a&gt;，就是为了让我们方便得到DbContext内部封装的ObjectContext而设计的。所以很简单：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;((IObjectContextAdapter)dbContext).ObjectContext;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;转换一下DbContext的接口类型就行了！&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;之后我还会为大家带来更多使用EF的小技巧，敬请期待！&lt;img src="http://www.cnblogs.com/Emoticons/msn/wink_smile.gif" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;PS：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如需转发请注明原文出处，谢谢：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/30/EF_Trick1.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/03/30/EF_Trick1.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/1999352.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/30/EF_Trick1.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html</id><title type="text">Entity Framework 4.1 DbContext使用记之二——如何玩转本地实体？ DbSet.Local属性的使用与实现</title><summary type="text">Entity Framework 4.1 DbContext使用记之二——如何玩转本地实体？ DbSet.Local属性的使用与实现。EF4.1系列博文第二篇！微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-03-25T01:44:00Z</published><updated>2011-03-25T01:44:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html"/><content type="html">&lt;p&gt;说好为大家带来一系列的文章，现在就写第二篇。开始之前，再啰嗦两句，EF4.1 RTW版本已经发布：&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en&lt;/a&gt;。第一篇有关DbSet.Find的文章，请看：&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;今天为大家带来&lt;a href="http://msdn.microsoft.com/en-us/library/gg696248(v=VS.103).aspx"&gt;&lt;strong&gt;DbSet.Local&lt;/strong&gt;&lt;/a&gt;属性的使用与实现。和上次介绍的&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"&gt;Find函数&lt;/a&gt;首先查找context中缓存的实体类似，DbSet的Local属性也是返回context中缓存并且被跟踪的实体。不同点在于，Local属性不会返回状态为EntityState.Deleted的实体，且即使缓存中什么实体都没有，也不会对数据库进行访问。这样的设计也正符合Local（本地）之意。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看一个例子：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;font class="Apple-style-span" color="#0000FF"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;db&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyDbContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;此处调用EF4.1的新扩展方法&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entity.dbextensions.load(v=VS.103).aspx"&gt;DbSet&amp;lt;&amp;gt;.Load()&lt;/a&gt;从数据库导入对应的实体到缓存中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.People.Load();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.People.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Person&amp;nbsp;{&amp;nbsp;Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Michael&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.People.Remove(db.People.Find(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;db.People.Local)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;这里调用了EF4.1的新方法&lt;a href="http://msdn.microsoft.com/en-us/library/gg696238(v=VS.103).aspx"&gt;Entry&lt;/a&gt;来得到实体的DbEntryEntry&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Found&amp;nbsp;{0}:&amp;nbsp;{1}&amp;nbsp;with&amp;nbsp;state&amp;nbsp;{2}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;p.PersonID,&amp;nbsp;p.Name,&amp;nbsp;db.Entry(p).State);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里的输出结果类似于：&lt;/p&gt;&lt;div&gt;&lt;span style="font-family: Consolas; line-height: 18px; font-size: small; color: #333333; "&gt;Found 0: Michael with state Added&amp;nbsp;&lt;br /&gt;Found 2: Jennie with state Unchanged&amp;nbsp;&lt;br /&gt;Found 3: Bob with state Unchanged&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Consolas; line-height: 18px; font-size: small; "&gt;Found 4: Mike with state Unchanged&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Consolas; line-height: 18px; font-size: small; "&gt;&lt;br /&gt;&lt;/span&gt;...&lt;/div&gt;&lt;p&gt;PersonID为1的实体不会出现在这里，因为此时它的状态是Deleted。而姓名为Michael的实体因为是新增的实体，其主键还没有在数据库端生成，所以其PersonID为0。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Local属性为什么这么设计呢？照理说状态为Deleted的实体同样应该是本地缓存的啊！读者可能会发现，Local属性返回的数据类型是&lt;a href="http://msdn.microsoft.com/en-us/library/ms668604.aspx"&gt;ObservableCollection&amp;lt;T&amp;gt;&lt;/a&gt;。我们知道ObservableCollection&amp;lt;T&amp;gt;常被用于WPF数据绑定。其实Local属性的设计也是为了方便大家做数据绑定的。试想在数据绑定时，如果被我们删除的实体仍然出现在Local属性的集合中，UI控件则会仍然显示这些已被我们标记为Deleted的实体。反之对于新增的实体（但还没有将更新提交到数据库），我们当然希望在做数据绑定时，UI控件也能显示它们的信息。再为大家介绍一些背景知识：过去我们如果直接把控件绑定到EF的&lt;a href="http://msdn.microsoft.com/en-us/library/dd412719.aspx"&gt;ObjectSet&amp;lt;T&amp;gt;&lt;/a&gt;集合上，如果我们删除某些实体（并未提交数据库），UI控件会有相应的反应（也删除实体）。但是当我们调用类似&lt;a href="http://msdn.microsoft.com/en-us/library/dd487277.aspx"&gt;AddObject&lt;/a&gt;方法在ObjectSet&amp;lt;T&amp;gt;里新增实体时，UI控件并不会有任何变化（新增实体不出现在控件）。个人觉得这是之前EF设计上的一些缺陷。有关更详细的讨论，请参阅这个MSDN帖子，&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/8ac0f9a9-00e0-431a-9e7a-cb31dde83828"&gt;http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/8ac0f9a9-00e0-431a-9e7a-cb31dde83828&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;有关Local属性的用法以及如何使用Local属性来做WPF和Winform数据绑定，可以参阅这三篇ADO.NET产品组的博文：（如果大家需要，我也可以对这些博文做翻译工作或者写一些有关EF数据绑定的文章）&lt;/p&gt;&lt;div&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/02/01/using-dbcontext-in-ef-feature-ctp5-part-7-local-data.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2011/02/01/using-dbcontext-in-ef-feature-ctp5-part-7-local-data.aspx&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/03/08/ef-feature-ctp5-code-first-model-with-master-detail-wpf-application.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2011/03/08/ef-feature-ctp5-code-first-model-with-master-detail-wpf-application.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/02/16/ef-feature-ctp5-code-first-and-winforms-databinding.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2011/02/16/ef-feature-ctp5-code-first-and-winforms-databinding.aspx&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面我们一起来分析下Local属性的实现。&lt;/p&gt;&lt;p&gt;由于没有EF4.1的源码，所以仍然使用&lt;a href="http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1"&gt;.NET Reflector&lt;/a&gt;。 DbSet&amp;lt;&amp;gt;.Local属性是只读的。其get方法调用EF内部封装的InternalSet&amp;lt;T&amp;gt;.Local属性(同样只读）。这里和上次介绍的&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"&gt;DbSet&amp;lt;&amp;gt;.Find&lt;/a&gt;函数一样，先调用DetectChanges函数来同步POCO实体的状态。（有关DetectChanges函数，详见MSDN文档&lt;a href="http://msdn.microsoft.com/en-us/library/dd456853.aspx"&gt;Working with POCO Entities&lt;/a&gt; ）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ObservableCollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Local&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.InternalContext.DetectChanges(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._localView&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DbLocalView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;view1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;._localView;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._localView&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DbLocalView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.InternalContext));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里判断_localView对象是否为NULL，但这里的逻辑我也不是很明白。在咨询了产品组之后发现，这是Reflector 6.5的分析IL时的一个问题。正确的代码应该是使用了类似于&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms173224(v=VS.100).aspx"&gt;C# ??&lt;/a&gt;的运算符来判断_localView对象是否为NULL。如果为NULL则生成一个&lt;strong&gt;DbLocalView&amp;lt;TEntity&amp;gt;&lt;/strong&gt;的对象并返回。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ObservableCollection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Local&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.InternalContext.DetectChanges(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._localView&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;??&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._localView&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DbLocalView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.InternalContext));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面看看&lt;strong&gt;DbLocalView&amp;lt;TEntity&amp;gt;&lt;/strong&gt;类的构造函数：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;DbLocalView(InternalContext&amp;nbsp;internalContext)&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._internalContext&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;internalContext;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._inStateManagerChanged&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(TEntity&amp;nbsp;local&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._internalContext.&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;GetLocalEntities&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;()&lt;/strong&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Add(local);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;finally&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._inStateManagerChanged&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._internalContext.&lt;/span&gt;&lt;span style="color: #000000; background-color: yellow; "&gt;&lt;strong&gt;RegisterObjectStateManagerChangedEvent&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CollectionChangeEventHandler(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000; background-color: #ffff00; "&gt;&lt;strong&gt;StateManagerChangedHandler&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;这里两个比较关键的函数是&lt;strong&gt;GetLocalEntities&lt;/strong&gt;和&lt;strong&gt;RegisterObjectStateManagerChangedEvent&lt;/strong&gt;。前者是调用了ObjectStateManager.GetObjectStateEntries(EntityState.&lt;strong&gt;Modified &lt;/strong&gt;| EntityState.&lt;strong&gt;Added &lt;/strong&gt;| EntityState.&lt;strong&gt;Unchanged&lt;/strong&gt;)以得到状态为Modified、Added和Unchanged的实体对象。而后者则是Local属性实现数据绑定功能的关键，将&lt;strong&gt;StateManagerChangedHandler&lt;/strong&gt;这个事件处理函数赋给&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.objectstatemanagerchanged.aspx"&gt;&lt;strong&gt;ObjectStateManager.ObjectStateManagerChanged&lt;/strong&gt;&lt;/a&gt;事件。该事件是当任何实体被添加或从ObjectStateManager中删除时都会被激发的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong&gt;StateManagerChangedHandler&lt;/strong&gt;函数其实就是在ObjectStateManagerChanged事件被激发时，调用对应的ObservableCollection&amp;lt;T&amp;gt;.Remove或ObservableCollection&amp;lt;T&amp;gt;.Add操作。这样也就将ObservableCollection&amp;lt;T&amp;gt;和EF缓存的实体联系了起来，简单的数据绑定便实现了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;StateManagerChangedHandler(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sender,&amp;nbsp;CollectionChangeEventArgs&amp;nbsp;e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._inStateManagerChanged&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TEntity&amp;nbsp;element&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;e.Element&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TEntity;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(element&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;((e.Action&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CollectionChangeAction.Remove)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Contains(element))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Remove(element);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;((e.Action&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CollectionChangeAction.Add)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Contains(element))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;base&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;.Add(element);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;finally&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._inStateManagerChanged&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;再次一口气写完。希望对您学习EF有所帮助吧！&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;系列博文之一：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"&gt;Entity Framework 4.1 DbContext使用记之一&amp;#8212;&amp;#8212;如何查找实体？ DbSet.Find函数的使用与实现&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;系列博文之三：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html"&gt;Entity Framework 4.1 DbContext使用记之三&amp;#8212;&amp;#8212;如何玩转实体的属性值？&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;PS：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如需转发请注明原文出处，谢谢：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/1993313.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html</id><title type="text">Entity Framework 4.1 DbContext使用记之一——如何查找实体？ DbSet.Find函数的使用与实现</title><summary type="text">Entity Framework 4.1 DbContext使用记之一——如何查找实体？ DbSet.Find函数的使用与实现。EF4.1系列博文第一篇！微软MSDN论坛资深技术支持工程师为您呈现。</summary><published>2011-03-22T09:49:00Z</published><updated>2011-03-22T09:49:00Z</updated><author><name>LingzhiSun</name><uri>http://www.cnblogs.com/LingzhiSun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"/><content type="html">&lt;div&gt;随着&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2dc5ddac-5a96-48b2-878d-b9f49d87569a&amp;amp;displaylang=en"&gt;EF4.1 RC&lt;/a&gt;上周的&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/16/ef41rc.html"&gt;发布&lt;/a&gt;，&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/threads"&gt;MSDN EF&lt;/a&gt;论坛的帖子也越来越多。相信大家会对EF4.1的一些新功能感兴趣。之后会为大家带来一系列的文章，与大家分享下我学习EF4.1的一些经验与感想。&lt;/div&gt;&lt;p&gt;顺便提一句，EF4.1的MSDN文档已经发布，&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/gg696172(v=VS.103).aspx"&gt;http://msdn.microsoft.com/en-us/library/gg696172(v=VS.103).aspx&lt;/a&gt;。这一系列文章，可能需要您对EF有一些初级的认识。头一次写这样介绍性的文章，大家多提意见！&lt;/p&gt;&lt;p&gt;[4.13添加]EF4.1 RTW 版本也发布啦，&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b41c728e-9b4f-4331-a1a8-537d16c6acdf&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第一篇为大家带来新的API，&lt;a href="http://msdn.microsoft.com/en-us/library/gg696418(v=VS.103).aspx"&gt;DbSet&amp;lt;&amp;gt;.Find()&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;过去我们常常用Where或First（FirstOrDefault）方法来查找对应的实体，比如：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;var&amp;nbsp;people&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;from&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p.Name.StartsWith(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;M&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; select&amp;nbsp;u;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 14px; "&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; "&gt;&lt;span style="color: #000000; "&gt;var&amp;nbsp;people&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;context.People.FirstOrDefault(p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;p.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&lt;span style="color: #800000; "&gt;Michael&lt;/span&gt;&lt;span style="color: #800000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 14px; "&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;这样查找的&lt;strong&gt;缺点&lt;/strong&gt;是：即使我们相应的实体已经被ObjectContext缓存，EF还是会去执行数据库访问，而数据库访问是被普遍认为比较耗费性能的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;EF4.1为我们提供了一个新的API：&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/gg696418(v=VS.103).aspx"&gt;DbSet&amp;lt;&amp;gt;.Find()&lt;/a&gt;。它可以帮助我们通过主键来查找对应的实体。并且如果相应的实体已经被ObjectContext缓存，EF会在缓存中直接返回对应的实体，而不会执行数据库访问。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;比如我们查找主键PersonID为1的Person实体：&lt;/p&gt;&lt;p&gt;var person = context.People.Find(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;也可用于联合主键（比如查找主键PersonID=1, PersonName="Michael"的实体）：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;var&amp;nbsp;person&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Find(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Michael&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：此处输入联合主键的次序需要按照我们定义改实体类时声明主键的次序。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;和之前直接用Where或First的调用不同，Find函数对于刚刚新增的实体也能找到：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(var&amp;nbsp;context&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyContext())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.People.Add(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;People&amp;nbsp;{&amp;nbsp;PersonID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;newPerson&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;context.People.Find(&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;了解了Find函数的基本用法后，让我们来看看Find函数是如何实现的。这里我们借用了&lt;a href="http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1"&gt;.NET Reflector&lt;/a&gt;来查看EF4.1的最重要的程序集EntityFramework.dll。&lt;/p&gt;&lt;p&gt;Find函数首先调用了EF的内部实现：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TEntity&amp;nbsp;Find(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;params&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;keyValues)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.InternalContext.DetectChanges(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WrappedEntityKey&amp;nbsp;key&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WrappedEntityKey(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.EntitySet,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.EntitySetName,&amp;nbsp;keyValues,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;keyValues&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;obj1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.FindInStateManager(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(obj1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;goto&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Label_003E;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;obj2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.FindInStore(key,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;keyValues&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;((obj2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;(obj2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TEntity))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Error.DbSet_WrongEntityTypeFound(obj2.GetType().Name,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(TEntity).Name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(TEntity)&amp;nbsp;obj2;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里，EF首先调用了DetectChanges()来同步内部ObjectContext跟踪的对象的状态。WrappedEntityKey则对过去的&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entitykey.aspx"&gt;EntityKey&lt;/a&gt;做了一个包装，每个主键对应于一个&lt;a href="http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx"&gt;KeyValuePair&lt;/a&gt;。将Find函数的输入值一一包装成KeyValuePair，并最终生成&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.entitykey.aspx"&gt;EntityKey&lt;/a&gt;对象。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;之后，Find函数调用了&lt;strong&gt;FindInStateManager&lt;/strong&gt;函数。顾名思义，EF首先在内部缓存中查找对应实体。对于状态是Unchanged、Modified以及Deleted的实体，FindInStateManager直接使用了过去&lt;a href="http://msdn.microsoft.com/en-us/library/bb359762.aspx"&gt;ObjectContext.ObjectStateManager.TryGetObjectStateEntry&lt;/a&gt;方法，并且直接将EntityKey传给该方法。对于状态是Added的新增实体，这里需要做的处理稍微复杂一些。EF先调用了&lt;a href="http://msdn.microsoft.com/en-us/library/bb738497.aspx"&gt;ObjectStateManager.GetObjectStateEntries(EntityState.Added)&lt;/a&gt;方法得到所有状态是Added的Entry。然后依次比较主键的值（之前得到的KeyValuePair）以判定是否为所要的实体。在得到Added状态的实体的值时，EF也使用了&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.currentvalues.aspx"&gt;ObjectStateEntry.CurrentValues&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果在内部缓存中找不到相应的实体，Find函数会调用&lt;strong&gt;FindInStore&lt;/strong&gt;函数来对数据库进行查找。FindInStore函数内部使用了&lt;a href="http://msdn.microsoft.com/en-us/library/bb387145.aspx"&gt;Entity SQL&lt;/a&gt;的查询，以这样一个Entity SQL命令为基础：SELECT VALUE X FROM {0} AS X WHERE。再将对应的主键名字拼接到这个命令中。主键值则以ObjectParameter的形式传递。最后FindInStore调用&lt;a href="http://msdn.microsoft.com/en-us/library/bb339670.aspx"&gt;ObjectContext.CreateQuery&amp;lt;&amp;gt;(...)&lt;/a&gt;.SingleOrDefault()函数来执行Entity SQL查询。由于最后使用了SingleOrDefault，如果数据库中也没有对应的实体存在，Find函数会返回NULL。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;终于一口气写完，希望对您学习EF有所帮助吧！&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;系列博文之二：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/25/EF41_Local.html"&gt;Entity Framework 4.1 DbContext使用记之二&amp;#8212;&amp;#8212;DbSet.Local属性的使用与实现&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;系列博文之三：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html"&gt;Entity Framework 4.1 DbContext使用记之三&amp;#8212;&amp;#8212;如何玩转实体的属性值？&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;PS：同事开发了一个很cool的MSDN论坛桌面小工具，绝对给力！欢迎使用！（我也出了不少力啊&lt;img src="http://www.cnblogs.com/Emoticons/msn/shades_smile.gif" alt="" /&gt;）&lt;/p&gt;&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=7dd3da55-7d3f-4473-8b50-6ea4b84c8172"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lingzhisun/msdn_gadget_banner.jpg" width="205" height="100" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;也欢迎到MSDN中文论坛&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/threads" style="font-weight: bold; "&gt;ADO.NET与LINQ&lt;/a&gt;论坛来提问EF的问题啊，可以试试直接报我的名字Michael Sun，哈哈！&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如需转发请注明原文出处，谢谢：&amp;nbsp;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html"&gt;http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/LingzhiSun/aggbug/1991710.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/LingzhiSun/archive/2011/03/22/EF41_Find.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
