以编程方式创建连接字符串,以便将Entity Framework Code-First模型与现有的Sql Server Compact数据库进行映射

时间:2011-07-02 16:47:55

标签: entity-framework compact-framework connection-string code-first

我已经使用app.config通过声明性方法成功地将实体框架代码优先数据模型与现有的Sql Server Compact数据库进行了映射,但如果我能以编程方式构建此类连接将会很棒可能是EntityConnectionStringBuilder(System.Data.EntityClient)类的帮助。不幸的是,这种方法不起作用,因为[DbContext].Connection.ConnectionString不接受其大部分属性。

这是有错误的实际工作代码注释掉的:

Book.cs

public class Book
{
    [Key]
    public string Isbn { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public string Publisher { get; set; }
    public DateTime Published { get; set; }
    public int Pages { get; set; }
    public bool InStock { get; set; }
    public string Description { get; set; }
}

Catalog.cs

public class Catalog : DbContext
{
    public DbSet<Book> Books { get; set; }
}

的app.config

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add
      name="Catalog"
      providerName="System.Data.SqlServerCE.4.0"
      connectionString="Data Source=res/Catalog.sdf"
  />
  </connectionStrings>
</configuration>

主要()

static void Main()
{
    // var res = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "res");
    // var str = new EntityConnectionStringBuilder();
    // str.Name = "Catalog";
    // str.Provider = "System.Data.SqlServerCe.4.0";
    // str.ProviderConnectionString = String.Format("Data Source {0}", Path.Combine(res, "Catalog.sdf"));

    try
    {
        using (var catalog = new Catalog())
        {
            // catalog.Database.Connection.ConnectionString = str.ConnectionString;

    // remaining code not relevant - skipped

我尝试过使用其他构建器类,例如SqlCeConnectionStringBuilder(System.Data.SqlServerCe),SqlConnectionStringBuilder(System.Data.SqlClient)甚至DbConnectionStringBuilder(System.Data)。常见的但显然没有一个似乎与[DbContext].Connection.ConnectionString所期望的相匹配。

我是否应该总结出没有程序化方法来实现这一目标? 任何建议一定会受到赞赏。非常感谢您的贡献。

2 个答案:

答案 0 :(得分:2)

如果您首先使用SQL Server Compact 4.0和DbContext代码,则不能使用EntityConnectionStringBuilder - 它会为EF和EDMX文件构建连接字符串。从SqlCeConnectionStringBuilder程序集版本4.0.0.0开始,您需要System.Data.SqlServerCe

您还应该通过构造函数将连接字符串传递给上下文实例 - DbContext具有接受连接字符串名称(来自配置)或连接字符串本身的构造函数。

答案 1 :(得分:2)

打开DbConnection并将其传递给DbContext构造函数或使用DefaultConnectionFactory:

Database.DefaultConnectionFactory
    = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

using (var catalog = new Catalog("Catalog.sdf"))
{
}

SqlCeConnectionFactory是Microsoft提供的即用型连接工厂,但您也可以实现自己的工厂。