实体框架4.1:有没有办法在运行时切换模式

时间:2011-11-10 10:39:50

标签: .net entity-framework mapping schema runtime

到目前为止(EFv1)我们使用了这个解决方案:http://efmodeladapter.codeplex.com/ 在升级到.NET Framework 4.0之后,我们正在寻找在使用Entity Framework 4.0 / 4.1时在运行时更改架构的内置方法吗?

更具体地说,我们在DB(A和B)上有两个大模式,只有模式A添加到模型中。 A和B中的表格完全相同。 我正在寻找一种在运行时间在A和B之间切换的解决方案。

5 个答案:

答案 0 :(得分:1)

没有。架构是mapping file的一部分。所以选项是:

  • 不要将映射文件用作资源。在运行时更改SSDL文件。
  • 使用两个不同的SSDL文件并在运行时构建连接字符串。

答案 1 :(得分:1)

我可以分别建议你两个型号。并根据条件使用一个或另一个。 例如

void Foo(DbContext model) {
    if (model.GetType() == typeof(FooNamespace.MyFooModel)){
        var db = model as FooNamespace.MyFooModel;
        //Do stuff
    } else {
        var db = model as BarNamespace.MyBarModel;
        //Do stuff
    }
}

如果你的模型有一些相似之处,你可以使用一些界面。如果你的模型共享一些commone属性,即它们都有Category个对象,那么为模型设置两个不同的命名空间就可以解决问题。

答案 2 :(得分:1)

正如Ladislav所说,你可以使用两个SSDL文件,

这是怎么做的。

  • 右键单击.edmx文件并选择属性
  • 将“元数据工件处理”更改为复制到输出目录
  • 从输出目录中打开.ssdl文件
  • 将所有架构=“dbo”替换为架构=“A”
  • 将文件另存为a.ssdl
  • 使用以下连接字符串

    初始化DbContext

    metadata =〜/ bin / Model1.csdl |〜/ bin / a.ssdl |〜/ bin / Model1.msl; provider = System.Data.SqlClient; provider connection string ='data source =。\ SQLEXPRESS; initial catalog =; integrated security = True; multipleactiveresultsets = True; App = EntityFramework';“;

答案 3 :(得分:0)

这是我对类似场景的看法(非常类似于@Greatran答案,但我在.EDMX文件上找不到任何元数据工件处理属性项):

  1. 至少构建一次包含EDMX文件的项目
  2. 获取生成的.SSDL文件的副本,该文件包含在
    Your\Project\Folder\obj\Debug\edmxResourcesToEmbed\Your\EDMX\Namespace\
  3. 的子路径中
  4. 复制并在您的项目中包含该内容,例如:与EDMX文件在同一目录中:...\Your\EDMX\Namespace\MyModel.ssdl
  5. 重命名后面添加后缀以匹配您的部署环境,例如对于Debug环境,它将是MyModel.Debug.ssdl
  6. 从其文件属性中,将 Build Action 设置为Embedded Resource
  7. 从Web项目Web.config文件中获取相关上下文连接字符串的副本。这应该是
  8. connectionString="metadata=res://\*/XXXXX.MyModel.csdl|
    res://*/XXXXX.MyModel.ssdl|
    res://*/XXXXX.MyModel.msl; 
    provider=ZZZZZ;provider connection string='AAAAA'" 
    1. 转换部署环境的Web项目配置文件中的连接字符串,例如Web.Debug.config,以便用自定义SSDL文件替换EDMX生成的SSDL文件:
    2. connectionString="metadata=res://\*/XXXXX.MyModel.csdl|
      res://*/YYYYY.MyModel.Debug.ssdl|
      res://*/XXXXX.MyModel.msl;
      provider=ZZZZZ;provider connection string='BBBBB'" 

      最后一点可能会变得棘手,至少在我的经验中,因为EDMX生成的SSDL资源的命名空间与我的自定义SSDL资源的命名空间不同。为了获得我的自定义资源的确切命名空间,我在VS中运行了一个调试会话,并在立即窗口中检查了this.GetType().Assembly.GetManifestResourceNames()的输出(感谢stu432)。

      此外,我更改了connection string ='AAAAA'部分以匹配部署环境中的数据库服务器。

答案 4 :(得分:0)

c# Entity Framework EF 4.1 Change Schema and Database name at runtime中的解决方案效果很好。它基本上在运行时更改SSDL资源中的模式,因此不需要为每个使用的模式生成新的SSDL。