EF6,Code-First,enable-migrations,“无法加载指定的元数据资源”

13

我创建了一个C#类库,其中包含3个实体类和一个DbContext,用于生成数据库的Code First。第1版一切顺利。我创建了一个单独的测试库,DbContext类的类库表现如预期。

现在,我想让其中一个字段为必填项,并按照Code First约定,在实体类的属性中添加了[Required]属性。下一步是启用迁移。

我进入了程序包管理器控制台,输入了“enable-migrations”,然后...崩溃了...“无法加载指定的元数据资源”。

参考我的DbContext类包括:

public OrganisationsContext()
    : base("Leegz_Entities_Organisations")
{
    this.Configuration.LazyLoadingEnabled = false;
    this.Configuration.ProxyCreationEnabled = false;
}

public DbSet<Organisation> Organisations { get; set; }
public DbSet<Member> Members { get; set; }
public DbSet<LeegzUser> LeegzUsers { get; set; }

我的 app.config 包含:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="Leegz_Entities_Organisations" connectionString="data source=NEIL-INSPIRON\NEILDEV;initial catalog=TheLeegz;integrated security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="Leegz.Entities.Organisations.DbSecuritySchema" value="Leegz.Entities.Organisations"/>
  </appSettings>
</configuration>

我看到了很多关于这个主题的线程,但它们似乎都是在谈论EDMX模型文件中引用元素的错误。然而,由于我使用的是Code-First,所以我没有一个模型(也许我在这里错过了一步),因此我看到的关于连接字符串中EDMX信息的建议似乎不适用于我。

有什么想法吗,请?


你的解决方案中有一个或几个项目吗? - alexmac
我在这个解决方案中有多个项目,Alexander。谢谢你下面的建议。 - Neil W
3个回答

24

我遇到了类似的问题,但结果不同。由于调试耗费了太多时间,以下是一些提示。

  1. "Unable to load the specified metadata resource." 错误与连接字符串有关。
  2. 首先检查包含所有实体的项目中的连接字符串。
  3. 确保连接字符串是 Code First 方法,而不是 Model FirstDatabase First 方法(请参见下面的示例)。
  4. 在解决方案中的所有包含与您的DbContext相关的连接字符串的项目中重复这些步骤。
  5. 然后,重新尝试 Enable-Migrations 命令,它应该可以正常工作。

Model first connection string example:

<add name="MyContext" 
    connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=MY_DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" />

Code first 连接字符串示例:

<add name="MyContext" 
    connectionString="Data Source=.;Initial Catalog=MY_DB;Integrated Security=True;MultipleActiveResultSets=True" 
    providerName="System.Data.SqlClient"/>

我曾经遇到过同样的问题,我的连接是数据库优先。 - Adeem
2
谢谢!说实话,我们需要多少种连接到SqlClient的方式?+1 - user585968
它可以工作,但我花了额外的5分钟才能识别出最后一行中的附加差异:providername="System.Data.SqlClient"。 - M.Buschmann
1
很多关于这个问题的帖子/回复都说“检查你的连接字符串”,但没有一个说明模型优先字符串与代码优先字符串有何不同。 - Adam Hey

5
  1. 如果您的解决方案中有多个项目,请确保在程序包管理器控制台窗口中选择了具有dbContext的项目。
  2. 迁移使用名称等于DbContext类的connectionString。 在您的情况下,它是OrganisationsContext,而不是Leegz_Entities_Organisations。

谢谢!!!当我将连接字符串更改为与DbContext类的名称匹配时,问题得到解决。因此... DbContext类在其构造函数中建立了一个特定的ConnectionString,因此库在运行时正常工作。但是,我认为您是在说迁移过程无法读取构造函数中包含的值,因此只使用DbContext类名称。这将与问题(以及您提供的解决方案)相吻合。您知道是否可以自定义(告诉)迁移使用特定的连接字符串名称吗? - Neil W
1
我知道 DbContext 构造函数中的 connectionStringName 是在运行时使用的。在迁移中,您可以添加参数 -ConnectionStringName(请参阅 get-help Enable-migrations 以获取帮助)。 - alexmac

0

当从EF 4/5/6模型优先/数据库优先转换为代码优先时,我忽略了删除\bin和\obj文件夹,并在迁移和读取数据时遇到了相同的错误。之后,这个错误消失了。

要将模型优先/数据库优先改为代码优先:

  1. 将连接字符串从EF(带有元数据信息)更改为传统的ADO。
  2. 删除EDMX文件和所有子文件(.tt、.cs模型等)。
  3. 删除项目中的\bin和\obj文件夹。

此时,您的项目应该处于代码优先模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接