0

按照本教程,我创建了我的DbConfiguration课程:

class ImgSigDbConfig : DbConfiguration
{
    public ImgSigDbConfig()
    {
        SetDefaultConnectionFactory(new LocalDbConnectionFactory("v11.0")); 
    }
}

并告诉我DbContext使用它:

[DbConfigurationType(typeof(ImgSigDbConfig))] 
class ImgSimContext : DbContext 
{

这似乎连接得很好,但我不知道它在哪里存储我的数据,我不喜欢那样。我希望它将所有内容保存到 App_Data 文件夹中的文件中。如何从ImgSigDbConfig构造函数中指定它?(假设我对 SQL 服务器连接一无所知)


做了一些更多的挖掘并想出了这个:

public ImgSigDbConfig()
{
    var sqlConnBuilder = new SqlConnectionStringBuilder();
    sqlConnBuilder.DataSource = ".";
    sqlConnBuilder.InitialCatalog = "ImgSim.ImgSimContext";
    sqlConnBuilder.IntegratedSecurity = true;
    sqlConnBuilder.AttachDBFilename = @"App_Data\database.mdf";

    SetDefaultConnectionFactory(new LocalDbConnectionFactory("v11.0", sqlConnBuilder.ToString()));
}

但现在它抛出:

提供者未返回 ProviderManifestToken 字符串


根据 haim 和 gunther 的建议,我删除了多余的连接设置:

class ImgSigDbConfig : DbConfiguration
{
    public ImgSigDbConfig()
    {
        var sqlConnBuilder = new SqlConnectionStringBuilder();

        sqlConnBuilder.IntegratedSecurity = true;
        sqlConnBuilder.MultipleActiveResultSets = true;

        SetDefaultConnectionFactory(new LocalDbConnectionFactory("v11.0", sqlConnBuilder.ToString()));
        SetManifestTokenResolver(new DefaultManifestTokenResolver());
    }
}

并将它们移到 Program.cs 中:

var conn = new SqlConnectionStringBuilder
{
    AttachDBFilename = @"App_Data\database.mdf",
    //InitialCatalog = "ImgSim.ImgSimContext",
};

using (var db = new ImgSimContext(conn.ToString()))

但即便如此,我还是得到了System.Data.Entity.Core.ProviderIncompatibleExceptionInnerException:

提供程序未返回 ProviderManifestToken 字符串。

即使我设置了SetManifestTokenResolver- 我猜默认的不起作用?

4

4 回答 4

2

LocalDbConnectionFactory 构造函数 v11.0 允许连接到 sqlserver 2012,默认情况下它会尝试在 app.config 中查找连接字符串的名称作为上下文全名。假设您没有在 config 中指定连接字符串并且想要创建一个名为 Test 的数据库(在下面指定的数据目录中),那么您需要像这样设置构造函数:

   [DbConfigurationType(typeof(ImgSigDbConfig))]
class MyDbContext : DbContext
{
    public MyDbContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
    }

    public DbSet<Person> Persons { get; set; }
}

现在您可以调用上下文:

AppDomain.CurrentDomain.SetData("DataDirectory", @"c:\App\DataDirectory");
        MyDbContext myDbContext = new MyDbContext("test"); //this is the name
        myDbContext.Persons.Add(new Person() { Id = 1, Name = "Name1" });
        myDbContext.SaveChanges();

配置将保持不变:

class ImgSigDbConfig : DbConfiguration
{
    public ImgSigDbConfig()
    {
        SetDefaultConnectionFactory(new LocalDbConnectionFactory("v11.0"));
    }
}

请注意我正在手动设置数据目录,因为它不是 Web 应用程序。您需要授予此目录的权限,以便可以创建和附加新数据库。我的 app.config 是这样的:

    <configuration>  <configSections>    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />  </configSections>  <connectionStrings>
  </connectionStrings>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
于 2014-06-14T21:02:39.527 回答
1

因此,默认情况下,Entity Framework 将寻找一个连接字符串来确定它应该打开哪个数据库,它当前使用的是 SQL Express 的一个版本(请参阅此处)。这只是让您轻松开发的默认设置。

一个典型的网站会有一个web.config您可以找到的文件。在那里你会看到类似的东西:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
          <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=testdb;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\testdb.mdf" providerName="System.Data.SqlClient" />
  </connectionStrings>

对于 Windows 窗体/控制台应用程序,将有一个app.config替代方案,但是它们具有相同的目的。

需要修改此连接字符串以使用您感兴趣的数据库,此时我推荐connectionstrings.com。你可以让它指向 SQL、Oracle 或任何你喜欢的东西。

于 2014-06-14T19:51:35.333 回答
1

您可以根据提供给 ImgSigContext 的连接字符串创建数据库

例子:

public class ImgSigContext : DbContext{
   public ImgSigContext(string connectionString) : base(connectionString)
}

并通过使用创建它

string connString = "..."; //here comes a valid connectionstring
bool created = new ImgSigContext(connString).Database.CreateIfNotExists();
//returns true if database didn't exist and is succesfully created
//works from Entity FrameWork 5 and up

或者像这样

// will automatically create if migrations is enabled
using(var context = new ImgSigContext(connString))
{
   // some logic comes here
}
于 2014-06-14T20:00:27.723 回答
1

baseConnectionString构造函数参数的文档MyLocalDbConnectionFactory明确指出:

用于数据库选项的连接字符串,而不是“初始目录”、“数据源”和“ AttachDbFilename ”。调用 CreateConnection 时,将根据数据库名称将“初始目录”和“附加数据库文件名”附加到此字符串中。“数据源”将根据 LocalDbVersion 参数进行设置。

试试这个:

var sqlConnBuilder = new SqlConnectionStringBuilder();
sqlConnBuilder.IntegratedSecurity = true;
sqlConnBuilder.MultipleActiveResultSets = true;

如果您正在运行控制台应用程序,请确保您DataDirectory已实际设置。用途:AppDomain.CurrentDomain.GetData("DataDirectory")

于 2014-06-14T20:23:15.030 回答