Невозможно определить имя поставщика для подключения типа 'System.Data.SqlServerCe.SqlCeConnection' - PullRequest
4 голосов
/ 10 мая 2010

Я использую платформу Ado.Net Entity Framework только с кодом (учебное пособие по адресу: блог команды ADO.NET ) и хочу быть максимально независимой от базы данных.

ВМой первый подход - я просто хочу использовать базы данных Sql Express и Sql Compact.С Sql Express все работает нормально, но с Sql Compact я получаю исключение, упомянутое в моем вопросе.

Кто-нибудь знает, можно ли подключиться к Sql Compact с использованием только кода?(с сгенерированным файлом .edmx для базы данных Sql Compact все работает нормально, но я хочу использовать только код!)

Вот код:

Мой класс, который строит DataContext:

public class DataContextBuilder : IDataContextBuilder
{
    private readonly DbProviderFactory _factory;

    public DataContextBuilder(DbProviderFactory factory)
    {
        _factory = factory;
    }

    #region Implementation of IDataContextBuilder

    public IDataContext CreateDataContext(string connectionString)
    {
        var builder = new ContextBuilder<DataContext>();
        RegisterConfiguration(builder);

        var connection = _factory.CreateConnection();
        connection.ConnectionString = connectionString;

        var ctx = builder.Create(connection);

        return ctx;
    }

    #endregion

    private void RegisterConfiguration(ContextBuilder<DataContext> builder)
    {
        builder.Configurations.Add(new PersonConfiguration());
    }
}

Строка

var ctx = builder.Create (connection);

вызывает исключение.

IDataContext - это простой интерфейс для ObjectContext:

public interface IDataContext
{
    int SaveChanges();

    IObjectSet<Person> PersonSet { get; }
}

Моя строка подключения настраивается в app.config:

<connectionStrings>
<add name="CompactConnection" connectionString="|DataDirectory|\Test.sdf"
  providerName="System.Data.SqlServerCe.3.5" />
</connectionStrings>

И действие по сборке начинается с

var cn = ConfigurationManager.ConnectionStrings["CompactConnection"];
var factory = DbProviderFactories.GetFactory(cn.ProviderName);
var builder = new DataContextBuilder(factory);
var context = builder.CreateDataContext(cn.ConnectionString);

1 Ответ

3 голосов
/ 23 июля 2010

Я должен ответить на свой вопрос.

Теперь это работает с Entity Framework CTP 4

и SQL Server Compact 4.0

...