【问题标题】:Cannot config connection string of EF6 in Multi-project solution无法在多项目解决方案中配置 EF6 的连接字符串
【发布时间】:2014-07-30 18:10:25
【问题描述】:

我有 2 个项目的一个解决方案:

我通过 nuget 为它们添加了 Entity Framework 6 和 Sql server compact。

<packages>
  <package id="EntityFramework" version="6.1.1" targetFramework="net45" />
  <package id="EntityFramework.SqlServerCompact" version="6.1.1" targetFramework="net45" />
  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net45" />
</packages>

我将此连接字符串添加到 DAL 的 Web 配置中:

 <connectionStrings>
    <remove name="connectionString"/>
    <add name="connectionString" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Database.mdf;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>

实体框架配置(我只将contexts 添加到BreezeDemo.DAL):

<entityFramework>
    <contexts>
      <context type="BreezeDemo.DAL.MyDbContext, BreezeDemo.DAL">
        <databaseInitializer type="BreezeDemo.DAL.SchoolInitializer, BreezeDemo.DAL" />
      </context>
    </contexts>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>

这是我在上下文中的代码:

public class MyDbContext : DbContext
    {
        public MyDbContext()
            : base("connectionString")
        {
            Database.SetInitializer<MyDbContext>(new SchoolInitializer());
        }

        public DbSet<Student> Students { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Course> Courses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }

当我尝试学生列表时:

public class StudentRepository
    {
        MyDbContext dal = new MyDbContext();

        public List<Student> GetAll()
        {
            return dal.Students.ToList();
        }
    }

EF 代码第一次运行,但它没有在 web 配置中使用我的连接字符串。它在BreezeDemo\App_Data 中创建数据库文件名“connectionString”。我在 web config 中的连接想要创建 db 文件名:BreezeDemo.DAL\App_Data 中的“数据库”。

我错过了什么吗?请帮助我让它正常工作。

【问题讨论】:

  • 您运行 BreezeDemo 项目,但连接字符串位于 BreezeDemo.DAL 项目中?

标签: entity-framework sql-server-ce-4 entity-framework-6.1


【解决方案1】:

如果我没记错的话,您的启动项目是BreezeDemo,但您的连接字符串位于BreezeDemo.DAL

您需要将&lt;configSections&gt;&lt;connectionStrings&gt;&lt;entityFramework&gt;元素从Web.Config of BreezeDemo.DAL复制到Web.Config of BreezeDemo

【讨论】:

  • 我希望所有数据访问都在 BreezeDemo.DAL 中完成,BreezeDemo 只需要添加 DAL 引用并从 DAL 调用一些公共函数。 DB 文件应在 DAL App_Data 中创建。请帮忙。
  • 一件事,将连接字符串移动到 BreezeDemo 后,我得到了新的错误Keyword not supported: 'attachdbfilename'.。可能是因为我的连接字符串中有任何错误:&lt;add name="connectionString" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True" providerName="System.Data.SqlClient"/&gt;
  • 你想使用 sql server 还是 sql compact ?你之前提到了sql compact,但是你的连接字符串是sql server,并且连接字符串路径是相对于启动项目的,你需要使用相对路径找到你想要的位置,比如..\..\..\ProjectName\AppData
  • 我想使用 sql compact,providerName 的连接可能有误。我了解路径,但是如何将此连接字符串放入 DAL 项目中。我的意思是当我将这个项目复制到某个地方时,我不需要更新新的启动项目连接字符串,只需添加 DAL 引用并使用它。
  • @Stiger,如果你使用sqlcompact,你的连接字符串是无效的,AttachDbFileName属于sqlserver,sqlcompact数据源位置是相对于启动项目的bin文件夹,你需要找到使用相对路径的位置,如..\..\..\ProjectName\App_Data 或绝对路径C:\..\..,也可以使用"Data source=|DataDirectory|Database.sdf",但它会相对于启动项目的App_Data
猜你喜欢
  • 2013-04-15
  • 2015-09-14
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多