实体框架从哪里获取到我的本地数据库的连接字符串



>我创建了一个网络表单,它是使用身份的注册表单。该窗体调用如下所示的代码隐藏:

protected void CreateUser_Click(object sender, EventArgs e)
{
    var userStore = new UserStore<IdentityUser>();
    var manager = new UserManager<IdentityUser>(userStore);
    var user = new IdentityUser() { UserName = UserName.Text };
    IdentityResult result = manager.Create(user, Password.Text);
    if (result.Succeeded)
    {
        StatusMessage.Text = string.Format("User {0} was created successfully!", user.UserName);
    }
    else
    {
        StatusMessage.Text = result.Errors.FirstOrDefault();
    }
}

我的网络配置文件是这样的:

<?xml version="1.0" encoding="utf-8"?>
<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>
    <system.web>
        <authentication mode="Forms" /> 
        <roleManager enabled="true" />
        <compilation debug="true" targetFramework="4.5" /> 
        <httpRuntime targetFramework="4.5" />
    </system.web>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

我的机器上还安装了MS SQL Express。当我使用表单时,该应用程序会在SQLExpress中创建一个名为DefaultConnection的数据库。

我的问题是实体/标识/.net 如何知道我的数据库,因为我没有在任何地方显式写入连接字符串?

如果这在某种程度上是"约定优于配置"的功能,那么我如何显式将实体定向到不同的数据库?

编辑:

我试过添加

<add name="MyConnection"
  connectionString="[the connection string];TrustServerCertificate=False"
  providerName="System.Data.SqlClient" />`

到连接字符串并更新了我的创建用户代码:

...
var connString = ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;
var context = new System.Data.Entity.DbContext(connString);
var userStore = new UserStore<IdentityUser>(context);
var manager = new UserManager<IdentityUser>(userStore);
...

但这抛出了一个InvalidOperationException,其中包含以下消息:

Additional information: The entity type IdentityUser is not part of the model for the current context.

上次编辑:

找出了如何避免异常,更改了以下内容:

var context = new System.Data.Entity.DbContext(connString);

进入这个:

var context = new Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext(connString);

按照惯例,将在本地 SQL Server 实例上创建本地数据库。

请参见: 新数据库的编码优先 - MSDN

按照惯例,DbContext 为您创建了一个数据库。

  • 如果本地 SQL Express 实例可用(默认情况下随 Visual Studio 2010 一起安装),则 Code First 已在该实例上创建了数据库
  • 如果 SQL Express 不可用,则 Code First 将尝试使用 LocalDb(默认情况下随 Visual Studio 2012 一起安装)
  • 数据库以派生上下文的完全限定名称命名

您可以通过在web.config中指定显式连接字符串来克服它,例如:

<configuration>
  <connectionStrings>
    <add name="MyDBContext"
         connectionString="Data Source=SQLServerAddress;Integrated Security=SSPI;Initial Catalog=yourdbName"
         providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

在这里,请记住将名称更改为在代码中扩展DbContext的类。

因此,例如,如果您要将DbContext扩展为:

public class MyDBContext : DbContext

然后使用 MyDBContext 作为配置中连接字符串的密钥。

或者当然,您可以在构造函数中传递连接字符串:

namespace MyCodeFirstProject 
{     
    public class MyDBContext: DbContext     
    {         
        public MyDBContext() : 
            base("Data Source=SQLServerAddress;Integrated Security=SSPI;Initial Catalog=yourdbName") {}
    }
}  

相关内容

  • 没有找到相关文章

最新更新