在不添加App.Config的Sql Server Compact Edition中使用实体框架



我正在为Rhinoceros 6开发一个插件,到目前为止,对Rhinocero的App.Config文件进行编辑似乎是不可能的。插件项目的App.Config对Rhinoceros的App.Config没有影响。

出现以下错误消息,因为我无法将提供程序和参数添加到App.Config<entityFramework>部分。

无法确定类型为"System.Data.SqlServerCe.SqlCeProviderFactory"的提供程序工厂的提供程序名称。请确保在应用程序配置中安装或注册了ADO.NET提供程序。

我用NuGet安装了EntityFramework.SqlServer.CompactMicrosoft.SqlServer.Compact,并检查了参考文献,一切似乎都很好。

下面是我的代码第一个dbcontext类:

public class ModelLocalClipper : DbContext
{ 
public ModelLocalClipper()
: base(new SqlCeConnection("Data Source="+ Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"\MyDatabase.sdf;Persist Security Info=False;"),
contextOwnsConnection: true)
{
Database.SetInitializer<ModelLocalClipper>(new CreateDatabaseIfNotExists<ModelLocalClipper>());
}

public DbSet<Scene> Scenes { get; set; }
public DbSet<LocalProject> LocalProjects { get; set; }
}
public class Scene
{
public int SceneId { get; set; }
public string Name { get; set; }
public int LocalProjectId { get; set; }
[ForeignKey("LocalProjectId")]
public virtual LocalProject LocalProject { get; set; }
}
public class LocalProject
{
public int LocalProjectId { get; set; }
public string Name { get; set; }
public virtual ICollection<Scene> Scenes { get; set; }
}

经过一段时间的搜索,我找到了这个解决方案,并将其转换为SQL Server CE,如下所示,但它对都没有帮助

public class SqlCeProviderInvariantName : IProviderInvariantName
{
public static readonly SqlCeProviderInvariantName Instance = new SqlCeProviderInvariantName();
private SqlCeProviderInvariantName() { }
public const string ProviderName = "System.Data.SqlServerCe.4.0";
public string Name { get { return ProviderName; } }
}
class SqlCeDbProviderFactoryResolver : IDbProviderFactoryResolver
{
public static readonly SqlCeDbProviderFactoryResolver Instance = new SqlCeDbProviderFactoryResolver();
private SqlCeDbProviderFactoryResolver() { }
public DbProviderFactory ResolveProviderFactory(DbConnection connection)
{
if (connection is SqlCeConnection) 
return SqlCeProviderFactory.Instance;
if (connection is EntityConnection) 
return EntityProviderFactory.Instance;
return null;
}
}
class SqlCeDbDependencyResolver : IDbDependencyResolver
{
public object GetService(Type type, object key)
{
if (type == typeof(IProviderInvariantName)) 
return SqlCeProviderInvariantName.Instance;
if (type == typeof(DbProviderFactory)) 
return SqlCeProviderFactory.Instance;
if (type == typeof(IDbProviderFactoryResolver)) 
return SqlCeDbProviderFactoryResolver.Instance;
return SqlCeProviderServices.Instance.GetService(type);
}
public IEnumerable<object> GetServices(Type type, object key)
{
var service = GetService(type, key);
if (service != null) yield return service;
}
}
class SqlCeDbConfiguration : DbConfiguration
{
public SqlCeDbConfiguration()
{
AddDependencyResolver(new SqlCeDbDependencyResolver());
}
}

版本:

  • RhinoCommon 6.30.20288.16410
  • .NET Framework 4.8
  • 实体框架6.4.4
  • SQL Server CE 4.0

在ErikEJ的指令下,它成功了!对于那些想了解代码的人来说,这里是repo:https://github.com/Tahirhan/RhinoPluginSqlCECodeFirst

谢谢!

尝试这种(简单得多(方法,我能够使用控制台应用程序:

public class SqlCeDbConfiguration : DbConfiguration 
{
public SqlCeDbConfiguration()
{
SetProviderServices(
SqlCeProviderServices.ProviderInvariantName,
SqlCeProviderServices.Instance);
SetDefaultConnectionFactory(
new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
}
}

然后:

[DbConfigurationType(typeof(SqlCeDbConfiguration))]
public class ModelSqlCECodeFirst : DbContext

正如这个答案所建议的,对于SQLite场景,尝试这个DbConfiguration,不要忘记删除"数据目录|";连接字符串中的部分

public class SQLiteConfiguration : DbConfiguration
{
public SQLiteConfiguration()
{
SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
}
}

最新更新