c#entity frameworkEF 4.1在运行时更改架构和数据库名称
我搜索了一些主题,但没有找到解决我问题的具体方法。
我的应用程序是ac#commercial app。 我先使用EF 4.1数据库。 我从开发数据库连接生成模型,并创建一个Model.edmx文件和所有EF的东西很好。
我的目标是为客户提供一个应用程序,让他自己创建数据库和数据库用户。 这样做,在运行时我会得到用户名,密码,数据库连接和模式名称参数来连接到客户数据库。 这样,部署应用程序我需要的只是让客户创建一个数据库并将数据库参数添加到app配置文件中。
因此,我的目标是在运行时更改连接字符串和模式参数,而不更改所有自动生成的edmx文件,而不是触及VS生成的代码。
我环顾四周,发现:
对于EF早期版本:
在运行时更改模式名称 – entity framework
http://efmodeladapter.codeplex.com
所有其他post都围绕着那个。 我甚至尝试使用第一个邮政编码但没有成功。
但我已经看到EF 4.1带有更好的支持工具来做到这一点,但我找不到它的参考或例子。 重要的是不要从VS更改自动生成的代码。
我是EF的新手,所以我想请求帮助来完成以下任务:a)在运行时更改连接字符串,添加我的用户名,密码和数据库服务器/端口参数b)更改数据库模式
我使用Oracle作为数据库服务器(因为Oracle将架构和用户混合在一起,这会使事情变得更糟)。
实际上,我也需要解决方案。 我很快就制定了解决方案,效果很好。 我没有在互联网上找到关于此的更多信息,所以我不确定“EF 4.1附带了更好的支持工具”。
具体示例“在运行时更改模式名称 – entity framework”并不完全适用于我,但是通过一些小的修改,我得到了它的工作。
这是一个可以执行此操作的DatabaseUtils类:
internal static class DatabaseUtils { /// /// Builds the connection string for Entity framework. /// /// public static EntityConnection BuildConnection(BuildConnectionParams buildConnectionParams) { var sqlBuilder = new SqlConnectionStringBuilder { DataSource = buildConnectionParams.ServerName, InitialCatalog = buildConnectionParams.DatabaseName, IntegratedSecurity = true }; var providerString = sqlBuilder.ToString(); var entityBuilder = new EntityConnectionStringBuilder { Provider = buildConnectionParams.ProviderName, ProviderConnectionString = providerString, Metadata = string.Format(@"res://*/{0}.csdl| res://*/{0}.ssdl| res://*/{0}.msl", buildConnectionParams.ModelName) }; return CreateConnection(buildConnectionParams.SchemaName, entityBuilder, buildConnectionParams.ModelName); } /// /// Creates the EntityConnection, based on new schema & existing connectionString /// /// Name of the schema. /// /// Name of the model. /// private static EntityConnection CreateConnection(string schemaName, EntityConnectionStringBuilder connectionBuilder, string modelName) { Func generateStream = extension => Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Concat(modelName, extension)); Action> disposeCollection = streams => { if (streams == null) return; foreach (var stream in streams.Where(stream => stream != null)) stream.Dispose(); }; var conceptualReader = generateStream(".csdl"); var mappingReader = generateStream(".msl"); var storageReader = generateStream(".ssdl"); if (conceptualReader == null || mappingReader == null || storageReader == null) { disposeCollection(new[] { conceptualReader, mappingReader, storageReader }); return null; } var storageXml = XElement.Load(storageReader); foreach (var entitySet in storageXml.Descendants()) { var schemaAttribute = entitySet.Attributes("Schema").FirstOrDefault(); if (schemaAttribute != null) schemaAttribute.SetValue(schemaName); } storageXml.CreateReader(); var workspace = new MetadataWorkspace(); var storageCollection = new StoreItemCollection(new[] { storageXml.CreateReader() }); var conceptualCollection = new EdmItemCollection(new[] { XmlReader.Create(conceptualReader) }); var mappingCollection = new StorageMappingItemCollection(conceptualCollection, storageCollection, new[] { XmlReader.Create(mappingReader) }); workspace.RegisterItemCollection(conceptualCollection); workspace.RegisterItemCollection(storageCollection); workspace.RegisterItemCollection(mappingCollection); var connection = DbProviderFactories.GetFactory(connectionBuilder.Provider).CreateConnection(); if (connection == null) { disposeCollection(new[] { conceptualReader, mappingReader, storageReader }); return null; } connection.ConnectionString = connectionBuilder.ProviderConnectionString; return new EntityConnection(workspace, connection); } }
用法:
/// /// Initializes a new instance of the class. /// public DynamicAQDContext() { var entityConnection = DatabaseUtils.BuildConnection(new BuildConnectionParams { ProviderName = "System.Data.SqlClient", ServerName = "localhost\\", DatabaseName = "", ModelName = "YOURMODEL", SchemaName = "SCHEMA" }); if(entityConnection == null) throw new Exception("Can't create EntityConnection"); _entities = new LINKEntities(entityConnection); }
更多信息可以在这里找到: http : //bestplayah.com/entity-framework-dynamic-schema-changes-using-database-first-approach/
- 通过在线源统一在手机上保存图像
- 对F#度量单位的反思
- WinForms – 如何从WebBrowser控件中执行C#应用程序代码?
- 如何在ASP.net Web应用程序中定义全局变量
- 为后面的代码中的xaml元素设置多绑定
- 操作失败:无法更改关系,因为一个或多个外键属性不可为空
- 发生时在Windows Phone中的System.Windows.ni.dll中发生类型为“’System.Reflection.TargetInvocationException’的未处理exception
- 无点 – 无法在MVC Bundling的单独文件中引用较少的变量
- 从BitmapSource复制到WritableBitmap