zoukankan      html  css  js  c++  java
  • Metadata file not found

    错误    3    正在编译转换: 未能找到元数据文件“F:Program Files (x86)Microsoft Visual Studio 12.0Common7Tools..IDEMicrosoft.Data.Entity.Design.DatabaseGeneration.dll”    E:Program Files (x86)Microsoft Visual Studio 12.0Common7IDEExtensionsMicrosoftEntity Framework ToolsDBGenSSDLToSQL10.tt    1    1    杂项文件

    原错误信息:

    纠结了一半天,总算在 stackoverflow 找到了答案,

    http://stackoverflow.com/questions/19664833/metadata-file-not-found-data-entity-model#

    (没读懂英文的可以看我下面的分析)

    问题简单分析,看下创建 EF 生成模型时候产生的 SSDLToSql10.tt(这是用于 Code First 模式下生成的一个模板文件,主要是用来生成一个 DLL SQL SCRIPT [此处没深入了解,如有不妥请指教])

      1 <# 
      2 //---------------------------------------------------------------------
      3 // <copyright file="SsdlToSql10.tt" company="Microsoft">
      4 //      Copyright (c) Microsoft Corporation.  All rights reserved.
      5 // </copyright>
      6 //---------------------------------------------------------------------
      7 // This T4 template generates T-SQL from an instance of 
      8 // System.Data.Metadata.Edm.StoreItemCollection, an object representation
      9 // of the SSDL. This T-SQL is compatible with SQL 2012, 2008, 2005, CE, and Azure databases.
     10 //---------------------------------------------------------------------
     11 // Note: We will resolve all paths in assembly directives at runtime, taking 
     12 // macros and environment variables into account (e.g. $(ProjectDir), %VS120COMNTOOLS% etc.)
     13 #>
     14 <#@ assembly name="System.Core" #>
     15 <#@ assembly name="%VS120COMNTOOLS%..IDEMicrosoft.Data.Entity.Design.DatabaseGeneration.dll"#>
     16 <#@ assembly name="%VS120COMNTOOLS%..IDEEntityFramework.dll"#>
     17 <#@ assembly name="%VS120COMNTOOLS%..IDEEntityFramework.SqlServer.dll" #>
     18 <#@ assembly name="%VS120COMNTOOLS%..IDEEntityFramework.SqlServerCompact.dll" #>
     19 <#@ import namespace="System.Linq" #>
     20 <#@ import namespace="System.Text" #>
     21 <#@ import namespace="System.Collections.Generic" #>
     22 <#@ import namespace="System.Data.Entity" #>
     23 <#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
     24 <#@ import namespace="Microsoft.Data.Entity.Design.DatabaseGeneration" #>
     25 <#@ import namespace="System.Runtime.Remoting.Messaging" #>
     26 <#@ import namespace="System.Text.RegularExpressions" #>
     27 <#@ template language="C#" debug="true" hostspecific="true" #>
     28 <#@ include file="GenerateTSQL.Utility.ttinclude"#>
     29 <#@ output extension = ".sql" #>
     30 <#
     31 
     32 // +++++++++++++++++++++++++++++++++++++++++++++++++
     33 // Setup for the template (initializing variables, etc.)
     34 // +++++++++++++++++++++++++++++++++++++++++++++++++
     35 
     36     string databaseName = this.GetInput<string>(EdmParameterBag.ParameterName.DatabaseName.ToString());
     37     string edmxPath = this.GetInput<string>(EdmParameterBag.ParameterName.EdmxPath.ToString());
     38     Version targetVersion = this.GetInput<Version>(EdmParameterBag.ParameterName.TargetVersion.ToString());
     39 
     40     DbConfiguration.SetConfiguration(new TemplateDbConfiguration());
     41 
     42     if (false == InitializeAndValidateExistingStore()) 
     43     {
     44 #>
     45 -- Warning: There were errors validating the existing SSDL. Drop statements
     46 -- will not be generated.
     47 <#
     48     }
     49 #>
     50 -- --------------------------------------------------
     51 <#
     52     if (this.IsSQLCE) {
     53 #>
     54 -- Entity Designer DDL Script for SQL Server Compact Edition
     55 <#
     56     } else {
     57 #>
     58 -- Entity Designer DDL Script for SQL Server 2005, 2008, 2012 and Azure
     59 <#
     60     }
     61 #>
     62 -- --------------------------------------------------
     63 -- Date Created: <#=DateTime.Now#>
     64 <#
     65     if (!String.IsNullOrEmpty(edmxPath))
     66     {
     67 #>
     68 -- Generated from EDMX file: <#=Id(edmxPath)#>
     69 <#
     70     }
     71 #>
     72 -- --------------------------------------------------
     73 
     74 <#  if (!this.IsSQLCE) 
     75     { 
     76 #>
     77 SET QUOTED_IDENTIFIER OFF;
     78 GO
     79 <#  if (!String.IsNullOrEmpty(databaseName))
     80     {
     81 #>
     82 USE [<#=Id(databaseName)#>];
     83 GO
     84 <#
     85     }
     86     foreach (string unescapedSchemaName in (from es in Store.GetAllEntitySets() select es.GetSchemaName()).Distinct())
     87     {
     88 #>
     89 IF SCHEMA_ID(N'<#=Lit(unescapedSchemaName)#>') IS NULL EXECUTE(N'CREATE SCHEMA [<#=Id(unescapedSchemaName)#>]');
     90 <#
     91     }
     92 #>
     93 GO
     94 <#  } #>
     95 
     96 -- --------------------------------------------------
     97 -- Dropping existing FOREIGN KEY constraints
     98 <#  if (this.IsSQLCE)
     99     {
    100 #>
    101 -- NOTE: if the constraint does not exist, an ignorable error will be reported.
    102 <#  } #>
    103 -- --------------------------------------------------
    104 
    105 <#
    106     foreach (AssociationSet associationSet in ExistingStore.GetAllAssociationSets())
    107     {
    108         ReferentialConstraint constraint = associationSet.ElementType.ReferentialConstraints.Single();
    109         string constraintName = Id(WriteFKConstraintName(constraint));
    110         AssociationSetEnd dependentSetEnd = associationSet.AssociationSetEnds.Where(ase => ase.CorrespondingAssociationEndMember == constraint.ToRole).Single();
    111         string schemaName = Id(dependentSetEnd.EntitySet.GetSchemaName());
    112         string dependentTableName = Id(dependentSetEnd.EntitySet.GetTableName());
    113         
    114         if (!this.IsSQLCE)
    115         {
    116 #>
    117 IF OBJECT_ID(N'[<#=Lit(schemaName)#>].[<#=Lit(constraintName)#>]', 'F') IS NOT NULL
    118 <#      } #>
    119     ALTER TABLE <# if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=dependentTableName#>] DROP CONSTRAINT [<#=constraintName#>];
    120 GO
    121 <#
    122     }
    123 #>
    124 
    125 -- --------------------------------------------------
    126 -- Dropping existing tables
    127 <#  if (this.IsSQLCE)
    128     {
    129 #>
    130 -- NOTE: if the table does not exist, an ignorable error will be reported.
    131 <#  } #>
    132 -- --------------------------------------------------
    133 
    134 <#
    135     foreach (EntitySet entitySet in ExistingStore.GetAllEntitySets())
    136     { 
    137         string schemaName = Id(entitySet.GetSchemaName());
    138         string tableName = Id(entitySet.GetTableName());
    139         
    140         if (!this.IsSQLCE)
    141         {
    142 #>
    143 IF OBJECT_ID(N'[<#=Lit(schemaName)#>].[<#=Lit(tableName)#>]', 'U') IS NOT NULL
    144 <#      } #>
    145     DROP TABLE <# if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=tableName#>];
    146 GO
    147 <#
    148     }
    149 #>
    150 
    151 -- --------------------------------------------------
    152 -- Creating all tables
    153 -- --------------------------------------------------
    154 
    155 <#
    156     foreach (EntitySet entitySet in Store.GetAllEntitySets())
    157     {
    158         string schemaName = Id(entitySet.GetSchemaName());
    159         string tableName = Id(entitySet.GetTableName());
    160 #>
    161 -- Creating table '<#=tableName#>'
    162 CREATE TABLE <# if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=tableName#>] (
    163 <#
    164         for (int p = 0; p < entitySet.ElementType.Properties.Count; p++)
    165         {
    166             EdmProperty prop = entitySet.ElementType.Properties[p];
    167 #>
    168     [<#=Id(prop.Name)#>] <#=prop.ToStoreType()#> <#=WriteIdentity(prop, targetVersion)#> <#=WriteNullable(prop.Nullable)#><#=(p < entitySet.ElementType.Properties.Count - 1) ? "," : ""#>
    169 <#
    170         }
    171 #>
    172 );
    173 GO
    174 
    175 <# 
    176     } 
    177 #>
    178 -- --------------------------------------------------
    179 -- Creating all PRIMARY KEY constraints
    180 -- --------------------------------------------------
    181 
    182 <#
    183     foreach (EntitySet entitySet in Store.GetAllEntitySets())
    184     {
    185         string schemaName = Id(entitySet.GetSchemaName());
    186         string tableName = Id(entitySet.GetTableName());
    187 #>
    188 -- Creating primary key on <#=WriteColumns(entitySet.ElementType.GetKeyProperties(), ',')#> in table '<#=tableName#>'
    189 ALTER TABLE <# if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=tableName#>]
    190 ADD CONSTRAINT [PK_<#=tableName#>]
    191     PRIMARY KEY <# if (!IsSQLCE) {#>CLUSTERED <#}#>(<#=WriteColumns(entitySet.ElementType.GetKeyProperties(), ',')#> <# if (!IsSQLCE) {#>ASC<#}#>);
    192 GO
    193 
    194 <#
    195     }
    196 #>
    197 -- --------------------------------------------------
    198 -- Creating all FOREIGN KEY constraints
    199 -- --------------------------------------------------
    200 
    201 <#
    202     foreach (AssociationSet associationSet in Store.GetAllAssociationSets())
    203     {
    204         ReferentialConstraint constraint = associationSet.ElementType.ReferentialConstraints.Single();
    205         AssociationSetEnd dependentSetEnd = associationSet.AssociationSetEnds.Where(ase => ase.CorrespondingAssociationEndMember == constraint.ToRole).Single();
    206         AssociationSetEnd principalSetEnd = associationSet.AssociationSetEnds.Where(ase => ase.CorrespondingAssociationEndMember == constraint.FromRole).Single();
    207         string schemaName = Id(dependentSetEnd.EntitySet.GetSchemaName());
    208         string dependentTableName = Id(dependentSetEnd.EntitySet.GetTableName());
    209         string principalTableName = Id(principalSetEnd.EntitySet.GetTableName());
    210 #>
    211 -- Creating foreign key on <#=WriteColumns(constraint.ToProperties, ',')#> in table '<#=dependentTableName#>'
    212 ALTER TABLE <#if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=dependentTableName#>]
    213 ADD CONSTRAINT [<#=WriteFKConstraintName(constraint)#>]
    214     FOREIGN KEY (<#=WriteColumns(constraint.ToProperties, ',')#>)
    215     REFERENCES <# if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=principalTableName#>]
    216         (<#=WriteColumns(constraint.FromProperties, ',')#>)
    217     ON DELETE <#=GetDeleteAction(constraint)#> ON UPDATE NO ACTION;
    218 <#      
    219         // if the foreign keys are part of the primary key on the dependent end, then we should not add a constraint.
    220         if (!dependentSetEnd.EntitySet.ElementType.GetKeyProperties().Take(constraint.ToProperties.Count()).OrderBy(r => r.Name).SequenceEqual(constraint.ToProperties.OrderBy(r => r.Name)))
    221         {
    222 #>
    223 
    224 -- Creating non-clustered index for FOREIGN KEY '<#=WriteFKConstraintName(constraint)#>'
    225 CREATE INDEX [IX_<#=WriteFKConstraintName(constraint)#>]
    226 ON <#if (!IsSQLCE) {#>[<#=schemaName#>].<#}#>[<#=dependentTableName#>]
    227     (<#=WriteColumns(constraint.ToProperties, ',')#>);
    228 <#      
    229         }
    230 #>
    231 GO
    232 
    233 <#
    234     }
    235 #>
    236 -- --------------------------------------------------
    237 -- Script has ended
    238 -- --------------------------------------------------
    SSDLToSql10.tt

    这里面就可以看到它引用了这几个程序集

    <#@ assembly name="System.Core" #>
    <#@ assembly name="%VS120COMNTOOLS%..IDEMicrosoft.Data.Entity.Design.DatabaseGeneration.dll"#>
    <#@ assembly name="%VS120COMNTOOLS%..IDEEntityFramework.dll"#>
    <#@ assembly name="%VS120COMNTOOLS%..IDEEntityFramework.SqlServer.dll" #>
    <#@ assembly name="%VS120COMNTOOLS%..IDEEntityFramework.SqlServerCompact.dll" #>

    索性我发现这几个程序集确实没在编译报错的路径中,我直接 copy 粘贴到了指定的目录下甚至还在编译器中引用,编译依旧如此。有点棘手!

    最后看了老外的分析,说是 visual studio 安装的环境变量值路径不对,后来才一愣发现真是这个问题

    控制面板->系统->高级系统设置->高级->环境变量

    最终才明白原来编译的路径依据是根据环境变量来的,真是图样图森破

  • 相关阅读:
    软件设计的哲学:第十七章 一致性
    软件设计的哲学:第十六章 修改现有代码
    软件设计的哲学: 第十五章 先写注释
    软件设计的哲学:第十四章 选个好名字
    软件设计的哲学:第十三章 注释应该描述代码中隐藏的内容
    软件设计的哲学:第二十章 为什么要写注释
    软件设计的哲学:第十一章 两次设计
    软件设计的哲学: 第十章 定义不存在错误
    软件设计的哲学: 第九章 合并还是分解
    软件设计的哲学:第八章 降低复杂性
  • 原文地址:https://www.cnblogs.com/byvar/p/4856556.html
Copyright © 2011-2022 走看看